我想创建一个具有许多属性的模块(在我的例子中,是带有前缀的国际单位制,如mm、cm、km等).显而易见的方法是一个接一个地指定它们,比如

# module.py

mm = "mm"
cm = "cm"
km = "km"
# and so on

目前,我想拥有大约600个此类属性,所以对我来说,这样做似乎是错误的.

# module.py

_prefixes = ["m", "c", "k"]
_names = ["m", "g"]

# Automate this
mm = "mm"
cm = "cm"
km = "km"
mg = "mg"
cg = "cg"
kg = "kg"

如果我想让这些属性成为一个类的属性,我可以使用setattr(class, prefix + name, prefix + name),但到目前为止,我还没有找到将其转换为模块属性的方法.

我知道我可以使用dict或类似的值来代替属性,但我想允许像from module import km这样的导入,据我所知,只有直接属性才可能.

有没有办法通过编程生成这些属性?如果是这样,我应该使用它还是逐个定义属性(例如使用为我生成python代码的脚本)?

推荐答案

python模块的属性是您放入全局命名空间中的任何内容,无论它是通过编程还是通过手动键入的代码完成的.您经常会看到以下语句用于添加模块属性:

  • import:类似from itertools import product的行将在模块中创建模块属性product.
  • defclass.这些关键字创建特殊类型的对象,其名称也出现在全局命名空间中.
  • =分的常规作业(job).在函数或类主体之外指定的任何内容也将成为模块属性.

如果要生成一组属性,可以通过globals()访问模块__dict__:

from itertools import product

_prefixes = ["m", "c", "k"]
_names = ["m", "g"]

for prefix, name in product(_prefixes, _names):
    globals()[prefix + name] = prefix + name

该模块将具有您可能不想要的属性productprefixname_prefixes_names.当它们不再需要时,您可以在代码末尾用del清除它们:

del product
del prefix
del name

尽管如此,这是一种效率极低的做事方式.您可能不需要 for each 字符串指定单独的属性.如果您想对这些单元进行任何类型的操作或查找,或者将它们用于"存在"之外的其他用途,您会希望它们位于某种数据 struct 中,例如listdict.

另一项是,与在代码中生成或硬编码名称不同,您可以考虑将它们放在一个配置文件中,用户可以在某处进行编辑.然后,该模块将包含用于定位和加载文本文件的代码.

Python相关问答推荐

如何将ctyles.POINTER(ctyles.c_float)转换为int?

如何检测背景有噪的图像中的正方形

无法通过python-jira访问jira工作日志(log)中的 comments

如何制作10,000年及以后的日期时间对象?

数据抓取失败:寻求帮助

如何使用pytest来查看Python中是否存在class attribution属性?

如何将一个动态分配的C数组转换为Numpy数组,并在C扩展模块中返回给Python

如何让这个星型模式在Python中只使用一个for循环?

UNIQUE约束失败:customuser. username

isinstance()在使用dill.dump和dill.load后,对列表中包含的对象失败

如果初始groupby找不到满足掩码条件的第一行,我如何更改groupby列,以找到它?

合并与拼接并举

如何获取Python synsets列表的第一个内容?

如何根据rame中的列值分别分组值

如何过滤组s最大和最小行使用`transform`'

如何获得满足掩码条件的第一行的索引?

read_csv分隔符正在创建无关的空列

Matplotlib中的曲线箭头样式

极点用特定值替换前n行

如何让PYTHON上的Selify连接到现有的Firefox实例-我无法连接到Marionette端口