导入可变属性的值¶
ID: py/import-of-mutable-attribute
Kind: problem
Security severity:
Severity: warning
Precision: medium
Tags:
- reliability
- maintainability
- modularity
Query suites:
- python-security-and-quality.qls
显式地从模块导入属性到当前命名空间意味着如果原始模块中的值发生变化,该属性的值将不会更新。
这可能意味着全局状态的变化在本地不会被观察到,这可能会导致不一致和可能的错误。
建议¶
不要使用from module import attr
,只需使用import module
导入模块,并将所有对attr
的使用替换为module.attr
。
示例¶
在下面显示的两个模块中的第一个模块中,from sys import stdout
用于导入stdout
属性,而不是使用import sys
导入模块。然后在main()
函数中使用stdout
。
from sys import stdout
def main():
stdout.write("Hello World!")
在下面的第二个模块中,定义了一个函数redirect_to_file
,用于收集来自sys.stdout
的输出并将其保存到文件。但是,当传递main()
函数时,redirect_to_file
将无法正常工作。这是因为main()
函数将看不到对sys.stdout
的更改,因为它使用的是模块加载时定义的stdout
的自身版本。
import sys
def redirect_to_file(function, args, kwargs, filename):
with open(filename) as out:
orig_stdout = sys.stdout
sys.stdout = out
try:
function(*args, **kwargs)
finally:
sys.stdout = orig_stdout
可以通过将第一个模块重写为导入sys
模块并写入sys.stdout
来解决此问题,如下所示。
import sys
def main():
sys.stdout.write("Hello World!")