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