循环遍历列表中的对象并将它们附加到其他对象



我试图通过变量列表循环,但我无法访问变量时,我附加了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的内容。

相关内容

  • 没有找到相关文章

最新更新