为了账号安全,请及时绑定邮箱和手机立即绑定

覆盖从python中的模块导入的变量

覆盖从python中的模块导入的变量

宝慕林4294392 2022-07-12 09:33:33
a.py:import sysh = 'this is h from a.py'for i in sys.argv:    if i in ['-h']:        print(h)b.py:import sysfrom a import hh='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”参数?谢谢
查看完整描述

2 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

主要问题

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.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库。


我希望我能提供帮助。


查看完整回答
反对 回复 2022-07-12
?
SMILET

TA贡献1796条经验 获得超4个赞

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


这是来自 a.py 的 h


为避免这种情况,您可以将 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。


查看完整回答
反对 回复 2022-07-12
  • 2 回答
  • 0 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号