坦白说,我用过
import *
并且感受到了痛苦。
具体来说,我有
from pyspark.sql.functions import *
,然后尝试使用已被自由导入覆盖的内置函数。
看看两者中存在多少相同的命名函数,我想我遇到碰撞只是时间问题:
>>> from pprint import pprint
>>> from pyspark.sql import functions as F
>>> pprint(list(set(dir(F)) & set(dir(__builtin__))))
['sum',
'__package__',
'__doc__',
'round',
'abs',
'min',
'bin',
'filter',
'ascii',
'__spec__',
'hex',
'__loader__',
'slice',
'hash',
'pow',
'max',
'__name__']
我尝试过更主动一点,看看我的全局命名空间发生了什么变化,但特别是内置函数让我感到困惑。
>>> ORIGINAL_GLOBALS = globals().copy()
>>> from pyspark.sql.functions import *
>>> MUTATED_GLOBALS = {key: value for key, value in globals().items() if (key in ORIGINAL_GLOBALS and ORIGINAL_GLOBALS[key] != value)}
>>> print(MUTATED_GLOBALS)
{}
我希望上面列出了被
import *
隐藏的上述功能,但是它是空的。
builtins
是否发生了一些我需要考虑的定制事情?builtins
有什么不寻常的地方,还有其他东西有相同的侧门吗?有没有一种好的 Python 方式可以让我检测全局命名空间中发生的更改?
Builtins 不在全局命名空间中。内置命名空间是上一层。
import builtins
并检查一下。