CodeQL 文档

导入可变属性的值

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

点击查看 CodeQL 仓库中的查询

显式地从模块导入属性到当前命名空间意味着如果原始模块中的值发生变化,该属性的值将不会更新。

这可能意味着全局状态的变化在本地不会被观察到,这可能会导致不一致和可能的错误。

建议

不要使用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!")

参考资料

  • ©GitHub, Inc.
  • 条款
  • 隐私