0

我有两个函数组织在两个文件中。例如

文件 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()?

是否可以a直接从 b.py 调用而无需导入a,只需使用简单名称a()而不是完全限定名称?

谢谢和最好的问候!

4

4 回答 4

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.

于 2013-01-16T07:43:56.690 回答
2

不,Python 怎么知道a应该在哪里?您的系统上可能有数千个 Python 文件,并且意味着其中的任何一个。

正如您所说,您将代码组织在两个文件中。让整个系统上的每个文件中的每个功能始终可用并不是很有条理。

但是你可以这样做:

# b.py
from a import a

def b():
    a()

这会从您的模块中提取一个函数,因此您无需使用模块名称来调用它。

于 2013-01-16T07:33:59.260 回答
1

你需要导入——但你可以做到from a import a。然后,您可以将其用作a().

于 2013-01-16T07:33:34.180 回答
1

如果你真的想这样做(你真的不想这样做),你总是可以从外部a注入。b

一个.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函数可能会更干净:

一个.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而不依赖于你的主要,这是你试图避免的。

一个.py:

def a():
    print "a"

b.py:

import a

def b():
    a.a()

主要.py:

import b
if __name__ == '__main__':
    b.b()

很好很简单。真的,在这种情况下你甚至不需要那个if __name__位,因为没有人会import main

于 2013-01-16T07:58:34.317 回答