gpt4 book ai didi

Python sys.argv 作用域规则

转载 作者:太空狗 更新时间:2023-10-29 22:22:36 24 4
gpt4 key购买 nike

我刚刚注意到 sys.argv 在导入的脚本中可见。

A.py

import sys
print("A")
print(sys.argv)
import B

B.py

import sys
print("B")
print(sys.argv)

产量

>> python A.py --foo bar
>> A
>> ['path/to/A.py', '--foo', 'bar']
>> B
>> ['path/to/A.py', '--foo', 'bar']

这很好,因为现在我不必在主脚本(aka.manage.py)中进行参数解析。

问题是:我可以依赖这种行为吗?是否存在这不起作用的情况?

最佳答案

模块属性,如 sys.argv 是对象。从哪个模块访问它们并不重要,它们是同一个对象。

这也意味着,如果一个模块修改了 sys.argv,那么该更改也会影响访问 sys.argv 的任何其他模块。


关于编码风格的提示:

虽然可能从两个不同的模块访问sys.argv,但我不推荐这样做,原因如下。

我喜欢也可以兼作模块的脚本。这为您重用代码提供了最大的灵 active 。 sys.argv 只有当代码作为脚本调用时才有意义。为了使代码用作模块,代码不应依赖于在 sys.argv 中查找值。

因此,我建议在主调用脚本中解析 sys.argv 一次:

if __name__ == '__main__':
import argparse
def parse_args():
... # argparse uses sys.argv

args = parse_args()

然后根据需要将 args 中的值传递给函数。

因此,if __name__ == 'main__' 语句之外的所有内容都不需要依赖于 sys.argv,因此可以通过简单的函数调用或模块来使用进口。

关于Python sys.argv 作用域规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22810183/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com