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

Lui*_*uis 3 python

我有以下代码:

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
    ....
Run Code Online (Sandbox Code Playgroud)

然而,这将字符串放入其中source_objects。我希望它引用变量(无论变量中保存的是什么),这意味着我真正想要的相当于

什么时候table = BQ_TABLE_NAME_CATEGORIES

source_objects = [ table_categories ] 
Run Code Online (Sandbox Code Playgroud)

什么时候table = BQ_TABLE_NAME_MANUFACTURERS

source_objects = [ table_manufacturers ] 
Run Code Online (Sandbox Code Playgroud)

Avi*_*hen 5

您可以使用 eval() 函数将字符串转换为变量: read on 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
Run Code Online (Sandbox Code Playgroud)

输出:

test.categories
test.manufacturers
Run Code Online (Sandbox Code Playgroud)

另外,正如评论中所述,您确实不应该覆盖 list,而应使用 mylist 或其他内容