python - 在客户端命名空间中集成类属性
问题描述
我想定义一堆在模块中使用的属性,这些属性也应该可以从其他模块访问,因为它们是我的接口契约的一部分。
我已经像这样将它们放在我的模块中的数据类中,但我想避免每次都对它们进行限定,类似于您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 文件
包- 目录中的模块集合,也可以导入,技术上也是一个模块
name -命名值的简写(在其他语言中通常只是“变量”),它们可以从模块中导入
使用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
这种导入链中的点只能放在模块对象之后,包和模块是什么,名称不是。因此,虽然看起来我们只是在访问对象的属性,但实际上我们依赖于普通对象不支持的机制,因此我们无法从它们内部导入。
在您的特定情况下,一个合理的解决方案是简单地将您想要保存模式的对象转换为项目中的顶级模块:
架构.py
key1 = 'key1'
key2 = 'key2'
...
这将使您可以选择以您最初建议的方式导入它们。做这样的事情来使你的项目中的公共常量易于访问并不罕见,例如 django 框架以settings.py
相同的方式使用 a 。
您应该记住的一件事是,python 模块中的名称实际上是单例,因此它们的值不能在运行时更改[1]。
[1]他们可以,但它太老套了,几乎总是被视为不可能。
推荐阅读
- c++ - 错误 - “#include 需要“文件名”或
" 在编译 g++ 文件时 | Visual Studio 代码 - excel - 在表格的新列中使用公式
- sqlite - Dill TypeError:无法腌制“sqlite3.Connection”对象。函数中的任何地方都没有 Sqlite
- atata - AutoSetUpConfiguredDrivers 偶尔会抛出“索引超出范围”异常
- python - 使用 pycharm 的 Python 程序未在 sublime 文本上运行
- asp.net - 从 SVG 点击调用 asp
- api - API 调用的属性约束:在模式或业务逻辑中捕获?
- r - 为什么我在使用闪亮的应用程序时得到无效的“宽度”或“高度”?
- php - 用于在 PHP cURL 中输出数组的 For 循环
- android - 定位 R+(版本 30 及更高版本)要求已安装 APK 的 resources.arsc 未压缩存储并在 4 字节边界上对齐