我正在尝试创建一个循环遍历两个列表的循环(模块中的一个本地,另一个模块中的另一个远程,我将其用作临时存储以供程序包中的其他模块访问)。我可以将其归结为一个小函数,它循环遍历 remote
$onChanges
远程商店只保存值,如下所示:
import remote
value_name = ['asset', 'liability']
value = {'asset':1.1, 'liability':2.2}
def sanity_check():
for i in range(len(value_name)):
if value_name[i] == 'asset':
remote.asset = value['{}'.format(value_name[i])]
local_display = '{:,.2f}'.format(value['{}'.format(value_name[i])])
remote_display = '{:,.2f}'.format(remote.asset)
print('local - ' + str(local_display) + ' remote - ' + str(remote_display))
if value_name[i] == 'liability':
remote.liability = value['{}'.format(value_name[i])]
local_display = '{:,.2f}'.format(value['{}'.format(value_name[i])])
remote_display = '{:,.2f}'.format(remote.liability)
print('local - ' + str(local_display) + ' remote - ' + str(remote_display))
sanity_check()
要从远程商店获取值,我必须使用其名称,如下所示:
global asset
asset = 0.0
global liability
liability = 0.0
我更喜欢使用对变量名的引用,就像我对局部变量
一样remote_display = '{:,.2f}'.format(remote.asset)
我试图找出如何使远程变量的名称( 下面的散列部分)成为变量:
local_display = '{:,.2f}'.format(value['{}'.format(value_name[i])])
有没有办法将远程部分(" .asset"部分)作为一个变量调用,这样我就可以遍历一段代码,而不是为我的每个可能的条目打破一个块。 value_name列表?
感谢您的期待;我尝试了很多方法,但无法弄清楚如何调用这个方法。
解决:实施Charles Duffy的答案产生了以下代码:
remote_display = '{:,.2f}'.format(remote.#####)
根据他提供的其他提示,会有更多更改,但这就是我现在所处的位置。谢谢查尔斯。
答案 0 :(得分:1)
您想要的是getattr()
和setattr()
。
那是:
values = {'asset': 1.1, 'liability': 2.2}
def sanity_check():
for key in values.keys():
# Q:Why are you bothering to print remote if you force it to match the local value?
setattr(remote, key, values[key]) ## instead of remote.<key> = values[key]
print('local - {:,.2f} remote - {:,.2f}'.format(values[key],
getattr(remote, key))
getattr(object, name[, default])
返回 object 的命名属性的值。 name 必须是字符串。如果字符串是对象属性之一的名称,则结果是该属性的值。例如,
getattr(x, 'foobar')
相当于x.foobar
。如果named属性不存在,则返回 default (如果提供),否则将引发AttributeError
。