python如何通过_X和all隐藏模块数据

电子说

1.3w人已加入

描述

1.1 描述

python的_X指出不被复制的变量,all指出要复制的变量。

NO 变量 描述
1 _X from module import*,不复制X变量(单下划线开头的变量)
2 all from module import *,只复制all列表内变量,用于模块文件; from pkg import *,只导入all列表内模块,用于包文件init.py;
3 _X和all 只针对from x import * 语句生效。 对非from的import语句无效。

1.2 模块_X

文件内容

pkgmoda.py

import os
print('run:{}'.format(os.path.abspath(__file__)))
s='梯阅线条'
_a='tyxt'
b=9555

from module import * 不复制_X变量

# cmd 执行下面命令
C:UsersAdministrator>e:&cd E:documentsF盘
E:documentsF盘>d:python3python
Python 3.7.8 (tags/v3.7.8:4b47a5b6ba, Jun 28 2020, 07:55:33) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
# from module import * 不复制_X变量
>>> from pkg.moda import *
run:E:documentsF盘pkg__init__.py
run:E:documentsF盘pkgmoda.py
# 复制非单下划线开头变量,可访问
>>> s
'梯阅线条'
>>> b
9555
# 不复制单下划线开头变量,不可访问
>>> _a
Traceback (most recent call last):
 File "", line 1, in 
NameError: name '_a' is not defined

单下划线开头变量,对非from的import语句无效,会被复制。

# cmd 执行下面命令
E:documentsF盘>d:python3python
Python 3.7.8 (tags/v3.7.8:4b47a5b6ba, Jun 28 2020, 07:55:33) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
# _X对import 语句无效
>>> import pkg.moda
run:E:documentsF盘pkg__init__.py
run:E:documentsF盘pkgmoda.py
>>> pkg.moda.s
'梯阅线条'
>>> pkg.moda.b
9555
# 可访问_a
>>> pkg.moda._a
'tyxt'

1.3 模块all

文件内容

pkgmodb.py

import os
__all__=['s','b',]
print('run:{}'.format(os.path.abspath(__file__)))
s='梯阅线条'
a='tyxt'
b=9555

from module import *,只复制all列表内变量,用于模块文件

# cmd 执行下面命令
E:documentsF盘>d:python3python
Python 3.7.8 (tags/v3.7.8:4b47a5b6ba, Jun 28 2020, 07:55:33) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from pkg.modb import *
run:E:documentsF盘pkg__init__.py
run:E:documentsF盘pkgmodb.py
# 在__all__列表的变量,可访问
>>> s
'梯阅线条'
>>> a
# 不在__all__列表的变量,不可访问
Traceback (most recent call last):
 File "", line 1, in 
NameError: name 'a' is not defined
>>> b
9555

all列表,对非from的import语句无效,不在列表内的变量也会被复制,可访问。

# cmd 执行下面命令
E:documentsF盘>d:python3python
Python 3.7.8 (tags/v3.7.8:4b47a5b6ba, Jun 28 2020, 07:55:33) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pkg.modb
run:E:documentsF盘pkg__init__.py
run:E:documentsF盘pkgmodb.py
>>> pkg.modb.s
'梯阅线条'
# 不在__all__列表的变量,也可访问
>>> pkg.modb.a
'tyxt'
>>> pkg.modb.b
9555

1.4 包all

文件内容

pkg__init__.py

import os
__all__=['moda',]
print('run:{}'.format(os.path.abspath(__file__)))

from pkg import *,自动导入all列表内模块,用于包文件 init .py;

# cmd 执行下面命令
E:documentsF盘>d:python3python
Python 3.7.8 (tags/v3.7.8:4b47a5b6ba, Jun 28 2020, 07:55:33) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from pkg import *
run:E:documentsF盘pkg__init__.py
run:E:documentsF盘pkgmoda.py
# 自动导入 __all__ 列表内模块
>>> moda.s
'梯阅线条'
# 非 __all__ 列表内模块不自动导入,不可访问
>>> modb.s
Traceback (most recent call last):
 File "", line 1, in 
NameError: name 'modb' is not defined
>>> modc.s
Traceback (most recent call last):
 File "", line 1, in 
NameError: name 'modc' is not defined
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分