我有两个功能组织在两个文件中。 E.g。
档案a.py
import b
def a():
print "a"
if __name__ == "__main__":
b.b()
文件b.py
import a # this is what I want to eliminate
def b():
a.a() # could I invoke a from a.py with simply a()?
是否可以直接从b.py调用a
而无需导入a
,只使用简单的名称a()
而不是完全限定的名称?
谢谢,最诚挚的问候!
答案 0 :(得分:4)
这两个文件是否在一个模块中?如果是这样,您可以使用__init__.py
从a
导入您的功能:
mymodule
/ __init__.py
:
from a import afunc
mymodule
/ a.py
:
def afunc():
print "afunc"
然后在mymodule
/ b.py
:
from mymodule import afunc
afunc()
这样,将来如果您更改a.py
的名称,则只需在__init__.py
中进行更改。
答案 1 :(得分:2)
没有。 Python如何知道a
应该在哪里?您的系统上可能有数千个Python文件,并且意味着它们中的任何一个。
正如您所说,您将代码组织在一起在两个文件中。让整个系统中的每个文件中的每个功能始终可用,这将不是很有条理。
但你可以这样做:
# b.py
from a import a
def b():
a()
这会从您的模块中提取单个函数,因此您无需使用模块名称来调用它。
答案 2 :(得分:1)
您需要导入 - 但您可以执行from a import a
。然后您可以将其用作a()
。
答案 3 :(得分:1)
如果真的想要这样做(并且你真的没有),你可以随时从外面向a
注入b
a.py:
import b
def a():
print "a"
b.a = a
if __name__ == "__main__":
b.b()
b.py:
"""NOTE: Before you can use this module, you must set `b.a` to a function of
no arguments that does ____!"""
def b():
a()
改为使用set_a
功能可能更清晰:
a.py:
import b
def a():
print "a"
b.set_a(a)
if __name__ == "__main__":
b.b()
b.py:
a = None
def set_a(func):
a = func
def b():
if not a:
raise Exception('You must call b.set_a before you can call b.b!')
a()
这个版本的模式实际上 有时出现。有时,b
的用户不需要考虑b.B
对象,因此在random
中有一些使用单一对象的便捷函数。现在,如果B
具有需要接受函数的任何函数(例如,处理程序,回调函数,替换套接字工厂......),则可能具有b.set_a
类型函数。
无论如何,正如我在评论中所解释的那样,我认为正确的答案是将a.py
重构为模块a.py
以及调用它的单独脚本main.py
。然后b.py
可以依赖于a
,而不依赖于您的主要内容,这是您要避免的内容。
a.py:
def a():
print "a"
b.py:
import a
def b():
a.a()
main.py:
import b
if __name__ == '__main__':
b.b()
美好而简单。实际上,在这种情况下你甚至不需要if __name__
位,因为没有人会import main
。