猿问

覆盖从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”参数?


谢谢


宝慕林4294392
浏览 191回答 2
2回答

阿波罗的战车

主要问题b.py您可以使用以下代码覆盖变量:import aa.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 sysh = '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 sysfrom a import h, what_is_himport awhat_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.pyh: this is h from a.pyh: this is h from b.pythis is h from b.py第一次what_is_h调用显示原始h值,第二次调用显示修改后的值。问题是a.py并且b.py似乎有不同版本的变量h,这就是所谓的范围。当您使用import语句时,python 会解析您的文件并运行代码。防止代码自动运行的方法是将其放在一个函数中,将其导入并运行它,b.py最好将h其作为参数传递(因为全局状态在 python 中通常是不好的做法)。“如果我也想从其中运行一个函数,a.py但前提是我直接运行它怎么办?”现在,如果您希望在运行时执行一个函数,a.py或者仅在直接b.py运行该函数a.py时才运行该函数,您可以将以下内容添加到脚本文件的底部:if __name__ == '__main__':    my_function()这将my_function仅在您执行时运行该函数$> python a.py。请注意,导入时a.py它不会运行my_function,除非以其他方式运行。这是如何运作的? __name__是一个内置的全局变量,用于存储 Python 解释器赋予 Python 脚本的“名称”。运行的文件被赋予__name__ '__main__'. a.py __name__现在,当从will导入某些东西时'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库。我希望我能提供帮助。

SMILET

导入 a 时,会执行 a.py 中的所有代码,因此您将始终获得打印输出:这是来自 a.py 的 h为避免这种情况,您可以将 a.py 更改为:import sysh = '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。
随时随地看视频慕课网APP

相关分类

Python
我要回答