【发布时间】:2017-03-01 21:39:37
【问题描述】:
编辑: 好吧,我几乎想通了(虽然它不是我想要的 100%,但它仍然有效)。这是execfile() 函数,我不敢相信我不知道它在那里。
我真的不知道如何表达这个问题(这就是我的谷歌搜索几乎没有出现这个问题的原因)......但是这里有。我将给出我正在尝试做的事情的简化版本。假设我有两个文件,main.py 和 extra.py。后者看起来像这样:
# extra.py
def setfoo(): # sets "foo" to 5 even if it is unassigned
global foo
foo = 5
如果我在控制台中运行它就非常简单:
>>> setfoo()
>>> foo
5
现在让我们回到main.py。我将设置一个导入语句,从extra.py 导入所有内容:
# main.py
from extra import *
setfoo()
print foo
在最后一行之前一切正常;但是,当main.py 尝试访问foo 时,它无法识别它,因为foo 实际上存储在文件extra.py 下。如果我在运行setfoo() 后再次导入所有内容,foo 将被导入并且一切正常。像这样:
# main.py
from extra import *
setfoo()
from extra import *
print foo
或者,如果我使用标准的import 语句而不是from...import 语句,则无需重新导入所有内容,因为来自extra.py 的数据被直接访问而不是复制过来。所以这也可以:
# main.py
import extra
extra.setfoo()
print extra.foo
但是,我真的不想每次运行setfoo() 时都必须输入extra.setfoo(),也不想每次使用上述功能时都重新导入extra.py。我想知道是否有解决方法。理想情况下,有一种方法可以修改extra.py,以便我在main.py 的原始版本中设置的代码可以正常工作。 (编辑:似乎很多人误解了这一点——我愿意修改extra.py,我不想修改main.py,除了顶部的导入语句,让这段代码工作。)如果这是不可能的,我也会考虑使用不同的方法来导入extra.py(我在想类似于PHP的include和require语句,其中导入的代码是字面上只是复制并粘贴到文件中),但我非常希望这个修改后的导入语句仍然只有一行代码,而且不是很长。所以换句话说,使用文件处理加上exec 语句可能不会很方便。
说到 exec 语句,我真的一点也不在乎我使用的编码实践有多糟糕。我真的只需要一种方法来让它工作,因为这个extra.py 文件的真实版本是我计划从现在开始在几乎所有项目中使用的东西,我不想占用很多额外的东西每次导入此文件时,我的代码中都会有空格。任何帮助将不胜感激。
编辑: 似乎很多阅读本文的人并不清楚我要完成的工作,所以这里是我的代码的真实版本。这是我为实现“内联变量赋值”而组合起来的语法技巧。这是代码(如果您不尝试将其导入另一个文件,则可以正常工作):
class use_obj(object):
def __rshift__(self, other): return other
def use(**kwargs):
for var in kwargs: exec 'global ' + var + '; ' + var + ' = kwargs[var]'
return use_obj()
语法如下:
print use(x = 5, y = 8) >> str(x) + " times " + str(y) + " equals " + str(x*y)
代码本身很糟糕,但我一直想要一种方法来执行内联变量赋值,因为我是内联 if 语句、列表推导、lambdas + reduce() 等的忠实粉丝。我能做到的原因'不仅仅是让函数返回分配的变量是因为use(x = 5, y = 8) 是一个表达式(不是语句),它返回一个奇怪的对象,然后我使用>> 运算符将它推入代码中,而@987654357 的奇怪对象由于我设置__rshift__() 函数的方式,返回的@ 函数神奇地消失了。
如果代码看起来像这样,我认为代码会失去很多美丽和新颖性:
print use(x = 5, y = 8) >> str(extras.x) + " times " + str(extras.y) + " equals " + str(extras.x*extras.y)
【问题讨论】:
-
在初始化
extra.py时,您是否有任何理由没有设置foo?否则,可能的解决方案是设置foo = None。 -
就像我说的那样,这是我实际尝试做的过于简化的版本。该函数的真实版本以这个设置
foo的方式设置多个变量,我无法知道它将设置哪些变量。所以这就是窗外。
标签: python python-2.7 import global-variables python-import