按照您想要的方式,您的意图将需要 file1 import file2 ,反之亦然 - 在纯代码中,这将导致循环导入,这显然不起作用。
但除此之外,如果文件上的函数、类或方法需要了解导入它们的文件上下文中的数据,正确的做法是将这些数据作为函数参数传入。
在你的情况下,你的“行动”功能应该是:
def action(username):
print username
在文件 1 上:
from file2 import action
username = "steven"
action(username)
(你也应该避免使用“import *”,因为它在阅读代码时隐藏了名称的来源,使其难以维护)
当然,Python 是 Python,有一些变通方法可以完全按照您的意愿行事 - 您可以创建一个特殊的装饰器以在您导入的函数上使用,该装饰器将从另一个文件重新创建您的函数,将其指向来自当前模块 - 但这太傻了。
“OOP”范式允许一种愚蠢的情况,它或多或少类似于您打算做的事情 - 方法使用类属性 - 如果该属性在子类中被覆盖,则该方法 - 甚至是原始的超类方法,将使用新的属性值 - 如:
class A(object):
username = ""
def action(self):
print self.__class__.username
B 类可以在其他文件中定义,如您所愿:
from file2 import A
class B(A):
username = "Mike"
b = B()
b.action()
现在,只是为了给你一个完整的答案——这里有一些代码可以做你想做的事——但_不要这样做——修改 yoru 函数以取而代之。
可以做的是有一个函数来读取它被调用的地方的全局变量。这不仅是“不是一个好的做法”——它只是错误的,除了一些非常有据可查的框架,其中“神奇的变量名”用于配置。即使我发现一个有这个坏习惯的框架,我也倾向于修补它的功能,以便我可以通过函数调用显式地传递配置。
from inspect import currentframe
def action():
caller_frame = current_frame(1)
caller_globals = caller_frame.f_globals
print caller_globals["username"]