【问题标题】:Using methods defined in __init__.py within the module使用模块内 __init__.py 中定义的方法
【发布时间】:2012-09-05 18:24:33
【问题描述】:

假设我有以下目录结构:

lib\
--__init__.py
--foo.py
--bar.py

在 foo 和 bar 中,有不同的方法,它们都需要相同的方法。例如:

富:

def method1():
    win()

酒吧:

def method2(number):
    if number < 0:
        lose()
    else:
        win()

__init__:

def win():
    print "You Win!"

def lose():
    print "You Lose...."

有没有办法在模块各自子文件的 init.py 中使用 win 和 lost 方法,或者我必须在文件夹中创建另一个文件并导入 foo 和 bar ?

【问题讨论】:

    标签: python


    【解决方案1】:

    是的,只需导入 __init__.py 模块(通过绝对或相对导入,都没有关系)。

    我从不喜欢相对导入,所以我会在mypackage.foo 中使用import mypackage,它会像相对导入一样导入__init__.py,然后在那里使用它。我也不喜欢在__init__.py 中放任何东西,不过一般来说,也许你应该考虑共享公共文件。

    【讨论】:

    • 使用相对导入有明确的原因,可维护性是首要原因。见PEP 328。 (不过,我同意将__init__.py 保持为空的建议。)
    • 我知道那里的原因,我只是认为它们不好(或超过绝对进口的原因):)。
    【解决方案2】:

    使用相对导入:

    from . import win, lose
    

    【讨论】:

    • 相对导入并不是重点,重点是您需要导入__init__.py,但是您愿意这样做。
    • 朱利安,画架解决方案有效。 from . import win, lose 从 "." 中导入 "win" 和 "lose",即当前包 = __init__.py.
    • @Bakuriu 当然可以,我只是说这不是重点,重点只是导入包含函数的模块——如何做取决于你:)。
    • 啊,好吧。我误解了你的评论。下次我会在回复之前阅读两次:s 顺便说一句,我喜欢相对进口...... de gustibus non est disputandum :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2017-06-11
    • 2013-04-21
    • 1970-01-01
    • 2020-06-11
    相关资源
    最近更新 更多