如何在Python中创建唯一的映射键?

如何在Python中创建唯一的映射键?,python,Python,我想制作一个包含单个项目的各种属性的映射,并在多个模块之间共享它。最明显的答案是使用字符串,但由于映射将在多个模块中使用,我不希望维护人员必须知道所有现有属性。例如,如果两个模块想要与“颜色”相关联的东西,它们就不应该意外地选择相同的名称而互相碰撞 我想到了一些不可行的想法: 1) 字符串、整数键:如上所述,这不容易扩展 2) 创建一个特定的类,使用id():例如,我认为创建一个Key()类是可行的,但对于从两个不同位置导入的模块来说,这是行不通的。例如,您可能希望按如下方式设置上述“颜色”属性

我想制作一个包含单个项目的各种属性的映射,并在多个模块之间共享它。最明显的答案是使用字符串,但由于映射将在多个模块中使用,我不希望维护人员必须知道所有现有属性。例如,如果两个模块想要与“颜色”相关联的东西,它们就不应该意外地选择相同的名称而互相碰撞

我想到了一些不可行的想法:

1) 字符串、整数键:如上所述,这不容易扩展

2) 创建一个特定的类,使用id():例如,我认为创建一个Key()类是可行的,但对于从两个不同位置导入的模块来说,这是行不通的。例如,您可能希望按如下方式设置上述“颜色”属性:

color = Key()
如果你这样做了,这是行不通的

#名为foo的模块

bar = Key()
import foo
id(foo.bar) == id(bar)
3) 查看堆栈跟踪以查看键的创建位置,并将其用作标识符的一部分。肯定不想使用行号,因为这太脆弱了。但是,在主模块的情况下,使用模块和项目名称失败。例如:

在foo.py中:

key = Key() # will be named foo.py-key
其他地方,在bar.py中:

import foo

foo.key   # will be named /Users/person/foo.py-key

谢谢!任何建议都将不胜感激。

请使用字符串,但在其前面加上当前模块名称。这样你就不会有任何碰撞了

key = __name__ + '.color'

这是一个好主意,但当前模块名不是_name _;-很容易改为“_main__;”。也许查看当前堆栈跟踪会给我模块名,但如果foo.py出现在两个单独的目录中,那么这将失败。不过,这比我现在拥有的更接近。不要用两个不同的名称导入同一个模块。如果你这样做了,你应该得到任何可怕的事情。python导入是否应该始终是一个有向图?如果不是,那么在循环导入的情况下,可以导入相同的模块两次,一次作为“\uuuu main\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。如何避免这种情况?另外,如果人们遵循不同的约定,一个作为“import foo.bar”导入,另一个作为“import foo.bar as bar”导入,该怎么办?最重要的是,您所说的模块只在一个名称下才是重要的,这意味着什么解决方案?谢谢解决方案2出现问题的唯一方法是,如果模块实际加载了两次,则只会在模块层次结构中出现两次,而这是不应该发生的。不要直接运行部分模块层次结构;如果
foo.py
应该是一个名为
foo
的模块,则将其作为
python-mfoo
运行(这会将其放在正确的位置),而不是
python foo.py
。本地别名并不重要
import foo.bar
import foo.bar as bar
都加载名为
foo.bar
的模块。