【问题标题】:Define cross-module/global variable from __init__.py从 __init__.py 定义跨模块/全局变量
【发布时间】:2017-08-14 09:10:17
【问题描述】:

我试图通过简单的导入来简化我的包(就像requests 模块一样)。

为此,我认为使用__init__.py 将是最佳选择。因为,当用户导入我的包时,__init__.py 被调用。然后我在里面添加了一些代码,从特定模块导入对象。

请想象一下,我的包和类对象都具有相同的名称:

# __init__.py
from index import packagename  # This is class object
myclass = myclass  # This is just example to be substituted, I know it has no effect
print(myclass)

每当导入包时,Python 都会记录 myclass 的类型:

<class 'packagename.index.packagename'> # "packagename" in the beginning is my package, "packagename" in the end is class object

但是,没有设置类的新实例:

<module 'packagename' from 'packagename/__init__.pyc'>


根据我的研究,我还没有为我的问题找到任何可靠的答案(如果我遗漏了什么,请致歉),但是,简而言之,我如何从__init__.py 定义变量以便用户可以使用它?

因此,每当用户导入 packagename 时,变量 packagename 将是类对象的实例,而不是模块。

谢谢!

【问题讨论】:

  • myclass = myclass - 你希望它做什么?
  • @user2357112 我对此没有任何期望,只是添加了我的变量定义不正确(在这种情况下无关紧要)的示例。我希望从__init__.py 导入可以工作...
  • 真的不清楚你想在这里做什么。将myclass 导入__init__.py 允许您执行from package import myclass 而不是from package.index import myclass。你还希望做什么?
  • @DanielRoseman 抱歉,我错误地替换了示例值,我正在从索引模块 from index import myclass 导入 myclass。所以假设包名与类名相同,我要做的是在导入包时导入类,例如,当我导入MyPackageName 模块MyPackageName 类对象时将被导入并且替换。
  • 用更合适的细节更新了答案。

标签: python import


【解决方案1】:

发现了。

requests 包使用和我一样的技术,它们的函数是从__init__.py 导入的,单个示例:

from .api import request, get, head, post, patch, put, delete, options

但是,这个函数只能从包中导入,所以仍然应该从包中调用:

requests.post

所以在我的例子中,Package 和 Class Object 具有相同的名称,但不幸的是,我认为它们不能以一种简洁的方式相互替换。

如果我的包被称为 Apple 并且 index.py 模块中的类对象也被称为 Apple。

如果我从 __init__.py 导入 Apple 类对象,我会这样称呼它:

Apple.Apple(其中 Apple[0] 是包的名称,Apple[1] 是类对象的名称)

【讨论】:

    猜你喜欢
    • 2010-11-25
    • 2016-10-20
    • 2017-06-02
    • 2011-03-01
    • 2021-06-26
    • 2015-01-02
    • 2014-02-18
    • 2016-02-10
    相关资源
    最近更新 更多