在python中重写从模块导入的变量

2024-04-26 11:54:13 发布

您现在位置:Python中文网/ 问答频道 /正文

a.py:

import sys

h = 'this is h from a.py'

for i in sys.argv:
    if i in ['-h']:
        print(h)

b.py:

import sys
from a import h


h='this is h from b.py'
for i in sys.argv:
    if i in ['-h']:
        print(h)

然后我得到:

>$  python b.py -h
 this is h from a.py
 this is h from b.py

'h'不应该被覆盖吗?或者a.py是否正在访问给定给b.py的'-h'参数

多谢各位


Tags: infrompyimportfor参数ifis
2条回答

导入时,将执行a.py中的所有代码,因此您将始终具有打印输出:

this is h from a.py

要避免此问题,可以将a.py更改为:

import sys

h = 'this is h from a.py'

if __name__ == '__main__':
    for i in sys.argv:
        if i in ['-h']:
            print(h)

这样,if子句中的代码将仅在调用python a.py -h时执行,而不是在调用python b.py -h时执行

主要问题

可以使用以下代码覆盖b.py中的变量:

import a
a.h = 'actually replaced value'

注意:实际上,将其添加到a.py仍然会得到以下结果:

>$  python b.py -h
 this is h from a.py
 this is h from b.py


创造被通缉的行为

首先请注意,您可以使用以下代码验证h的值是否已更改:

a.py:

import sys

h = 'this is h from a.py'

for i in sys.argv:
    if i in ['-h']:
        print(h)


def what_is_h():
    print('h:', h)

b.py:

import sys
from a import h, what_is_h
import a

what_is_h()
a.h = h = 'this is h from b.py'
what_is_h()

for i in sys.argv:
    if i in ['-h']:
        print(h)

其结果如下:

this is h from a.py
h: this is h from a.py
h: this is h from b.py
this is h from b.py

第一个what_is_h调用显示原始的h值,第二个显示修改后的值。问题是a.pyb.py似乎有不同版本的变量h。这就是所谓的范围。当您使用import语句时,python解析您的文件并运行代码。防止代码自动运行的方法是将其放置在函数中,导入并从b.py运行代码,最好将h作为参数传递(因为在python中,全局状态通常是不好的做法)

“如果我也想从a.py运行一个函数,但必须直接运行它怎么办?”

现在,如果希望在运行a.pyb.py时执行函数,但只有在直接运行时才在a.py中运行该函数,则可以将以下内容添加到脚本文件的底部:

if __name__ == '__main__':
    my_function()

这将仅在执行$> python a.py时运行函数my_function。 请注意,当导入a.py时,它将不会运行my_function,除非以其他方式运行

这是怎么回事? __name__是一个内置的全局变量,它存储python解释器给python脚本的“名称”。运行的文件被赋予__name__{}。现在,当从a.py导入内容时__name__将等于'a',并且my_function将不会运行

关于代码的更多样式注释和提示

  • 平等:

而不是

if i in ['-h']:
  # ... your code

if i == '-h':
  # ... your code

如果以后要检查多个标志,可以对其进行更改。

  • 检查列表或序列中是否有类似对象的内容:

如果只想检查-h是否在sys.args中,可以执行以下操作:

if '-h' in sys.args:
  # ... your code

而不是

for i in sys.args:
  if i == '-h':
    # ... your code
  • 解析、处理和处理命令行参数

如果您计划使用参数执行更复杂的操作,那么默认情况下,在每次安装python时都应该包含一个库,即argparse

我希望我能帮上忙

相关问题 更多 >