突然想研究一下如果我在本地目录里创造一个tensorflow库的相同接口,但实现有些差异,我的本地目录里的程序是会调用tensorflow库(在C:\Users\tellw\AppData\Local\Programs\Python\Python310\Lib\site-packages目录下)的接口还是自定义接口,如果它能调用自定义的魔改接口,可以方便我在不改动源代码的情况下调试本地的代码。

实验

项目结构:

1
2
3
4
|- test.py
|- jieba
|- __init__.py
|- time.py

项目代码的说明中涉及jieba库的两种实现,一种是实验中的自定义实现,我就直说为jieba,另一种是site-packages目录下的官方jieba实现,我定义为原生jieba

test.py

1
2
3
4
5
6
7
8
import jieba
import sys

print(sys.path)

print(jieba.time.localtime())

print('bbbb')
'C:\\Users\\tellw\\AppData\\Local\\Programs\\Python\\Python310\\python310.zip', ...]```,据此可知解释器导入模块时,首先搜索```C:/Users/tellw/test```目录,找不到再沿列表按序向下搜索,直到找到目标模块,所以这里首先加载的是本地目录里的jieba模块。再调用本地实现的jieba模块的函数。
1
2
3
4

改变本地的```jieba```目录名为```jieba1```,则会搜索到```原生jieba```的```time.localtime()```接口,打印当前时间。

```jieba/__init__.py```

from jieba import time

1
2
3
我当初查询```dir(jieba)```看到结果里有个```time```,以为是jieba又实现了个新的属于它自己的time函数,再看到```原生jieba```的```__init__.py```文件里```import time```才知道```dir()```能获取模块的上下文(环境、属性),而这个上下文包含所有导入的模块。```jieba```的包初始化代码这样写的原因是导入time属性,并且由于解释器的搜索路径是项目目录,在项目目录里找到```jieba```,```jieba```有个名为time的脚本,加载进来作为jieba的上下文。

```jieba/time.py```

def localtime():
print(‘aaaa’)
print(‘cccc’)
return ‘dddd’

对于jieba.time.localtime()的本地实现,如果没有return那行代码,那么localtime()函数没有返回值,则打印localtime()的值时会打印出None```

创建于2023.2.22/15.15,修改于2023.2.22/15.16