如何在没有短名称的情况下调用全局函数?

时间:2013-01-16 07:29:58

标签: python python-2.7

我有两个功能组织在两个文件中。 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()而不是完全限定的名称?

谢谢,最诚挚的问候!

4 个答案:

答案 0 :(得分:4)

这两个文件是否在一个模块中?如果是这样,您可以使用__init__.pya导入您的功能:

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