我试图通过变量列表循环,但我无法访问变量时,我附加了self
var_list = [account, user, authenticator, database, schema, warehouse, role]
for var in var_list:
if var == None:
var = self.var # <---- the .var here is not taking the var from var_list
else:
var
任何想法?
你的问题不是很清楚,但看起来你想要得到,按顺序
self.account
self.user
self.authenticator
等
您可以使用getattr
函数:
var_list = ["account", "user", "authenticator", "database", "schema", "warehouse", "role"]
for var in var_list:
var_value = getattr(self, var)
没有好的方法来更新一个给定字符串名称的变量的值。我会咬紧牙关,写一系列if
语句。
if account is None:
account = self.account
if user is None:
user = self.user
# etc
注意,我不认为使用exec
执行动态构造的赋值语句是一个很好的选择。
RoadieRich是正确的,尽管在可以避免使用getattr/setattr的情况下,应该小心过多地使用它。(例如,如果您的用户可以控制var_list,他们可以访问他们想要的任何属性。)
如果您只想访问这些属性的值:
var_list = [self.account, self.user, self.authenticator,
self.database, self.schema, self.warehouse, self.role]
简单看一下为什么会这样:直观地说,python有一个变量名到值的映射。(实际上有很多映射,但为了简单起见,我们忽略它。你可以阅读这篇文章获得更多信息)。这个映射可能看起来像:
account =>> 1234
user =>> User class @ 0x0340 [A reference to a User class at some random place in memory]
...
当你运行var_list = [account, user]
时,它会做类似
account =>> 1234
user =>> User class @ 0x0340
var_list =>> List class @ 0x0350 <list_0>
list_0<element 0> =>> 1234
list_0<element 1> =>> User class @ 0x0340
...
注意列表中的元素只知道它们的值,而不知道它们的名称。
如果您的映射看起来像:
self =>> YourClass @ 0x0340 <your_class_0>
your_class_0<account> =>> 1234
your_class_0<user> =>> User class @ 0x0350
...
然后尝试执行var_list = [account, user]
将导致错误,因为在映射表中没有任何名为account
的内容。