如何在Python中动态引用变量?

3

I have the following code:

PROJECT_ID = 'test'
BQ_TABLE_NAME_CATEGORIES = 'categories'
BQ_TABLE_NAME_MANUFACTURERS = 'manufacturers'
list = [BQ_TABLE_NAME_CATEGORIES, BQ_TABLE_NAME_MANUFACTURERS]
table_categories = PROJECT_ID + '.'  + BQ_TABLE_NAME_CATEGORIES
table_manufacturers = PROJECT_ID + '.' + BQ_TABLE_NAME_MANUFACTURERS

for table in list:
    ....
    source_objects=['table_{0}'.format(table)]  #reference to the correct var
    ....

然而,这将字符串放在source_objects中。我希望它引用变量(无论变量中保存了什么)的内容。 也就是说,我实际上想要的是以下等效内容

table = BQ_TABLE_NAME_CATEGORIES

source_objects = [ table_categories ] 

table = BQ_TABLE_NAME_MANUFACTURERS
source_objects = [ table_manufacturers ] 

你是想把 table_categories 的内容放进一个列表里吗?还是只是想引用它的字符串值? - saud
此外,覆盖内置的 list 对象是不好的编程实践。 - saud
@RottenCandy 我想要引用... source_objects 应该包含 table_categories 包含的任何内容.. 就像我会做的一样:source_objects = [table_categories] - Luis
2个回答

5
您可以使用eval()函数将字符串转换为变量: 查看eval
PROJECT_ID = 'test'
BQ_TABLE_NAME_CATEGORIES = 'categories'
BQ_TABLE_NAME_MANUFACTURERS = 'manufacturers'
mylist = [BQ_TABLE_NAME_CATEGORIES, BQ_TABLE_NAME_MANUFACTURERS]
table_categories = PROJECT_ID + '.'  + BQ_TABLE_NAME_CATEGORIES
table_manufacturers = PROJECT_ID + '.' + BQ_TABLE_NAME_MANUFACTURERS

for table in mylist:
    source_objects=eval('table_{0}'.format(table)) #reference to the correct var
    print source_objects

输出:

test.categories
test.manufacturers

同时,正如评论中所提到的,您真的不应该覆盖list,而应该使用mylist或其他名称。


3
如果我理解你的问题正确,你想要做的是将 table_categoriestable_manufacturers 的值存储在一个名为 source_objects 的列表中。假设 table_... 变量是全局的。
suffixes = [BQ_TABLE_NAME_CATEGORIES, BQ_TABLE_NAME_MANUFACTURERS]

source_objects = []
for s in suffixes:
    source_objects.append(globals['table_{0}'.append(s)])
    ...

这将为您提供以下内容:
>>> source_objects
['test.categories', 'test.manufacturers']

如果table_...变量不是全局变量,请使用locals()。详情参见https://docs.python.org/3/library/functions.html#globals


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接