如何在运行时访问未知对象 - 而不是他们的名字

时间:2013-03-09 21:34:56

标签: python globals

我正在解析一些按某种顺序包含部分的文档。我需要知道他们的顺序以匹配一些解析目标。现在我有这些列表,这里有两个

possible_seq_1 = [1, '1A', '1B', 2, 3, 4, 5, 6, 7, '7A',
           8, 9, '9A', '9B', 10, 11, 12, 13, 14, 15]


possible_seq_2 = [1, '1A', '1B', 2, 3, 4, 5, 6, 7, '7A',
           8, 9, '9A(T)', '9B', 10, 11, 12, 13, 14, 15]

我想使用上面列表中的项目作为字典的键,其中值指示我进入下一步

my_dict = dict()
aKey =  = '_'.join([str(item) for item in possible_seq_1])
my_dict(aKey) = 'something'

因此,当我稍后处理某些内容时,我可以简单地测试该对象是否与我的字典中的某个键匹配

我的问题是,我将在后面添加一些未知数字的might_seq(uences)(现在我有十个替代方案)我将序列键入我的代码,就像我在此消息中所做的那样然后在运行代码之前我必须进行一些更改以合并我的新序列。具体来说,我必须在以下

中增加范围
my_dict = dict()
for sequence in range(1,10,1):
    dict_key = '_'.join([str(item) for item in possible_seq_ + str(sequence)
    my_dict[dict_key] = something

当我这样做时,我想知道Python是否提供它所知道的对象,因为它们已在代码中定义。我发现他们的名字可用,但我无法弄清楚如何抓取/引用对象本身

我想我能做到

seq_list = [ item for item in globals() if 'possible_seq' in item if type(item) == list ]

但是,我得到一个空列表,这很有趣,因为名称是一个字符串,所以全局给我一个对象名称列表 - 我希望实际对象不是这个代码给我名字的名字

seq_list = [ item for item in globals() if 'possible_seq' in item ]

我承认,当我正在研究这个问题时,我意识到更简单的事情就是将序列作为列表添加到序列列表中,但现在我对这个其他方法感兴趣只是为了提高我对Python的理解

1 个答案:

答案 0 :(得分:3)

诀窍是globals()是一个字典,而不是一个列表,所以只需迭代globals()中的项目只能得到它们的名字。由于您要检查每个名称中是否possible_seq,您可以使用字典的.items()方法迭代名称和对象:

[v for k, v in globals().items() if 'possible_seq' in k]

然而,正如你猜测的那样,这不是一个好方法。 很多更好的是保留列表列表,例如:

possible_seqs = [[1, '1A', '1B', 2, 3, 4, 5, 6, 7, '7A',
           8, 9, '9A', '9B', 10, 11, 12, 13, 14, 15],
                 [1, '1A', '1B', 2, 3, 4, 5, 6, 7, '7A',
           8, 9, '9A(T)', '9B', 10, 11, 12, 13, 14, 15]]

请参阅keep data out of your variable names