Python中的高级模块话题

1、在模块中隐藏数据

_X以及__all__的使用

把下划线放在变量名之前(例如,_X),可以防止客户端使from * 语句导入模块名时,把其中的那些变量名复制出去。因为from * 会把所有的变量名复制出去,导入者可能得到超出它所需的部分变量或者可能会覆盖导入者内的变量。而这种写法不是像C++那样的“私有”声明,还是可以使用其他导入形式得到并修改这类变量名的,例如,使用import语句。

此外,也可以在模块顶层把变量名的字符串列表赋值给变量__all__,以达到类似与_X命名惯例的隐藏效果。例如:

__all__ = ['Error', 'encode', 'decode'] # Export these only

使用这功能时,from * 语句只会把列在__all__列表中的这些变量名复制出来。事实上,这与_X惯例相反:__all__是指出要复制的变量名,而_X是指出不被复制的变量名。Python会先寻找模块内的__all__列表;如果没有定义的话,from * 就会复制出开头没有下划线的所有变量名。同样,__all__列表只对from * 语句形式有效,它并不是私有声明。

2、修改模块搜索路径

模块搜索路径是一个目录列表,可以通过环境变量PYTHONPATH以及可能的.pth路径文件进行定制。Python程序本身修改搜索模块路径,是通过修改名为sys.path(内置模块sys的path属性)的内置列表。sys.path在程序启动时就会进行初始化,但之后,可以随意对其元素进行删除、附加和重设。

>>> import sys
>>> sys.path
['',
 'C:\\Users\\zhaopp5\\Documents\\Crise\\py_notebook',
 'D:\\software\\anaconda\\python37.zip',
 'D:\\software\\anaconda\\DLLs',
 'D:\\software\\anaconda\\lib',
 'D:\\software\\anaconda',
 'D:\\software\\anaconda\\lib\\site-packages',
 'D:\\software\\anaconda\\lib\\site-packages\\hello-1.0-py3.7.egg',
 'D:\\software\\anaconda\\lib\\site-packages\\win32',
 'D:\\software\\anaconda\\lib\\site-packages\\win32\\lib',
 'D:\\software\\anaconda\\lib\\site-packages\\Pythonwin',
 'D:\\software\\anaconda\\lib\\site-packages\\IPython\\extensions',
 'C:\\Users\\zhaopp5\\.ipython']
 >>> sys.path.append('C:\\sourcedir')
 >>> import string

一旦做了这类修改,就会对Python程序中将要导入的地方产生影响,因为所有导入和文件都共享了同一个sys.path列表。事实上,这个列表可以任意修改:

>>> sys.path = [r'd:\\tmp']
>>> sys.path.append('c:\\lp4e\\examples')
>>> sys.path
['d:\\tmp', 'c:\\lp4e\\examples']

>>> import string
Traceback (most recent call last):
File "<stdin>", line 1, in <modul e>
I mportError: No module named string

因此,可以使用这个技巧,在Python程序中动态配置搜索路径。不过小心:如果从路径中删除重要目录,就无法获取一些关键的工具了。

此外,使用以上设置方法只在修改的Python会话或程序(即进程)中才会存续。在Python结束后,不会保留下来。而PYTHONPATH和.pth文件路径配置是保存在操作系统中,保存在设置的环境变量中的,而不是执行中的Python程序。

Guess you like

Origin blog.csdn.net/Zhaopanp_Crise/article/details/102762219