Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重载在Python中使用全局变量的导入函数_Python_Overloading - Fatal编程技术网

重载在Python中使用全局变量的导入函数

重载在Python中使用全局变量的导入函数,python,overloading,Python,Overloading,有点类似于-但具有功能 假设我有主文件.py: 全局主变量1、主变量2 main_var1=“” 主变量2=0 def main(): 对于gkey,gval已排序(globals().items()): 打印(“mf_glb”,gkey,“is”,类型(gval),“和等于”,gval) 对于dir()中的名称: myvalue=eval(名称) 打印(“mf_dir”,名称,“is”,类型(myvalue),“且等于”,myvalue) 设置() 打印(“main_文件显示”,main_va

有点类似于-但具有功能

假设我有
主文件.py

全局主变量1、主变量2
main_var1=“”
主变量2=0
def main():
对于gkey,gval已排序(globals().items()):
打印(“mf_glb”,gkey,“is”,类型(gval),“和等于”,gval)
对于dir()中的名称:
myvalue=eval(名称)
打印(“mf_dir”,名称,“is”,类型(myvalue),“且等于”,myvalue)
设置()
打印(“main_文件显示”,main_var1,main_var2,“设置为”+str(eval(“设置”)))
def设置():
全局主变量1,主变量2
main_var1=“已初始化”
主变量2=-123
如果名称=“\uuuuu main\uuuuuuuu”:
main()
如果我直接运行
main_file.py
,它将输出(如预期的那样):

如果我使用
python user_file.py
运行它,我会得到如下结果:

('  uf2_glb', 'setup', 'is', <type 'function'>, 'and is equal to ', <function setup at 0xb7709374>)
('  uf2_dir', 'setup', 'is', <type 'function'>, 'and is equal to ', <function setup at 0xb7709374>)
...
A: setup is <function setup at 0xb7709374>
B: setup is <function setup at 0xb7709a74>
...
('  mf_glb', 'setup', 'is', <type 'function'>, 'and is equal to ', <function setup at 0xb7709374>)
...
('main_file says', 'Initialized', -123, '  setup is <function setup at 0xb7709374>')
(“uf2\U glb”、“设置”、“是”、“等于”)
('uf2_dir'、'setup'、'is'、'和等于',)
...
答:设置是正确的
B:设置很简单
...
('mf_glb'、'setup'、'is'、'和等于',)
...
('main_file说,'Initialized',-123,'setup is')
因此,基本上,我重载的
setup()
位于
0xb7709a74
,并且只在
user_文件中更改;而
main_文件
仍在
0xb7709374
处使用其旧的
setup()
,因此不会打印预期的重载更改

在上面链接的问题的答案中,有一份教程的副本,其中解释了:

实际上,模块中的全局变量只是该模块的一个属性(即成员实体),类似于类变量在类中的角色。当模块A导入模块B时,B的命名空间将复制到A的命名空间。如果模块B有一个全局变量X,那么模块a将创建一个该名称的变量,其初始值是模块B在导入时为其该名称的变量所拥有的值。但其中一个模块中对X的更改不会反映在另一个模块中


那么,有没有办法从
user\u文件
中重载
main\u文件
中的函数?事情可能会变得更加困难,因为
setup()
实际上使用
main\u文件中的全局变量来工作

的确,似乎有;首先请注意,您可以使用
检查
模块。然后,原则上,您可以在
user_file.py
中获取
setup()
函数的(新)源代码,并将其“发送”到
main_file.py
中的函数,在那里它可以是
exec
'd(
eval
无法接受
def
)-但这必须在全局上下文中完成(在
main_file.py
中),这样,当通过
exec
运行
def
时,指向旧函数的全局符号将被替换

或者作为示例-从OP中选择上面的
user_file.py
,只需在主文件之前添加以下内容:

#。。。
进口检验
setupsrc=inspect.getsource(安装程序)
设置设置(setupsrc)
main()
。。。并在
主文件.py
中添加一个新函数
setsetup()

def设置(仪表):
#全局设置#不需要,下面的globals()会处理它
cc=编译(instr、'abc'、'single')
#打印(抄送)
#<0xb77d1218处的编码对象模块,文件“abc”,第1行>
打印(“ss1”,str(设置))
exec(cc,globals())#globals()在这里实现了这个技巧
打印(“ss2”,str(设置))
然后,当我运行
python user_file.py
时,我得到:

...
A: setup is <function setup at 0xb774717c>
B: setup is <function setup at 0xb77476f4>
...
('ss1', '<function setup at 0xb774717c>')
('ss2', '<function setup at 0xb775a924>')
...
('  mf_glb', 'setup', 'is', <type 'function'>, 'and is equal to ', <function setup at 0xb775a924>)
...
('main_file says', 'Overloaded', 42, '  setup is <function setup at 0xb775a924>')
。。。
答:设置是正确的
B:设置很简单
...
(‘ss1’,“”)
(‘ss2’,“”)
...
('mf_glb'、'setup'、'is'、'和等于',)
...
('main_file'says','Overloaded',42','setup is')
。。。这表明函数已按预期过载(即使它不是正在运行的
user\u file.py
内部的
setup()
实例,而是包含
main\u文件的源副本)


注:请注意,任何
def
'd函数也有一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
属性,其对象类型与
compile()
的输出相同(即与之相关)-然而,我不能在这里真正使用它。

你真的不应该在全局变量上这样做。我建议找到另一种传递状态信息的方法。也许可以定义一个类。感谢@user2357112!我应该提到,我知道在这种情况下,类是正确的做法,但我很好奇这在原则上是如何工作的(而且,我有一个“main_文件”,为此,将其移植到类可能不值得。
:)
)干杯!
...
A: setup is <function setup at 0xb774717c>
B: setup is <function setup at 0xb77476f4>
...
('ss1', '<function setup at 0xb774717c>')
('ss2', '<function setup at 0xb775a924>')
...
('  mf_glb', 'setup', 'is', <type 'function'>, 'and is equal to ', <function setup at 0xb775a924>)
...
('main_file says', 'Overloaded', 42, '  setup is <function setup at 0xb775a924>')