在客户端命名空间中集成 class 个属性

Integrate class attributes in client namespace

我想定义一堆属性以供在一个模块中使用,这些属性也应该可以从其他模块访问,因为它们是我的接口契约的一部分。

我已经像这样将它们放在我的模块中的数据 class 中,但我想避免每次都对它们进行限定,类似于您在模块中使用 import * 的方式:

@dataclass
class Schema:
    key1='key1'
    key2='key2'

在同一模块中:

<mymodule.py>

print(my_dict[Schema.key1])

我希望能够做到这一点:

print(my_dict[key1])

我希望有一个等效的语法:

from Schema import *

这也允许我从其他模块执行此操作:

<another_module.py>
from mymodule.Schema import *

但这不起作用。

有办法吗?

简短的词汇表

模块 - 可以导入的python文件

package - 目录中的模块集合,也可以导入,技术上也是一个模块

name - shorthand for a named value(在其他语言中通常只是“变量”),它们可以从模块中导入


使用 import 语句允许您导入包、模块或名称:

import xml                                                     # package
from xml import etree                                          # also a package
from xml.etree import ElementTree                              # module
from xml.etree.ElementTree import TreeBuilder                  # name
# --- here is where it ends ---
from xml.etree.ElementTree.TreeBuilder import element_factory  # does not work

这样的导入链中的点只能在module objects之后做,包和模块是什么,名字不是。因此,虽然看起来我们只是访问对象的属性,但实际上我们依赖于普通对象不支持的机制,因此我们无法从它们内部导入。

在您的特定情况下,一个合理的解决方案是简单地将您想要保存架构的对象转换为项目中的顶级模块:

schema.py

key1 = 'key1'
key2 = 'key2'
...

您可以选择按照最初建议的方式导入它们。做这样的事情来使您的项目中的公共常量易于访问并不罕见,例如 django 框架以相同的方式使用 settings.py

您应该记住的一件事是 python 模块中的名称实际上是 singletons,因此它们的值无法在运行时更改[1].


[1] 他们可以,但它太老套了,几乎总是应该被视为不可能。