我有一個函式(這里稱為analyze_data),它接受一個物件和一個字串作為輸入,并使用字串通過getattr. 當資料處于“第一”級別的屬性 ( data1) 時,這可以正常作業。但是,我不知道當它們處于較低級別(data2)時我可以傳遞給函式以訪問資料。傳遞點字串(如下所示)不起作用。
class a:
pass
instance1 = a()
# Create 1st data set
instance1.data1 = [1,2,3]
# Create 2nd data set
instance1.subdata = a()
instance1.subdata.data2 = [4,5,6]
def analyze_data(myvar, dataname):
data = getattr(myvar, dataname)
# Do something with data, e.g.:
print(str(data[0]))
analyze_data(instance1, 'data1')
analyze_data(instance1, 'subdata.data2')
data2在不過多更改現有功能的情況下訪問的最佳方式是analyze_data什么?
uj5u.com熱心網友回復:
而不是使用getattr你應該使用attrgetterwhich 允許你指定使用點符號。這確實需要對您的功能進行微小的更改,如下所示。
from operator import attrgetter
def analyze_data(myvar, dataname):
fn = attrgetter(dataname)
data = fn(myvar)
# Do something with data, e.g.:
print(str(data[0]))
analyze_data(instance1, 'data1')
1
analyze_data(instance1, 'subdata.data2')
4
uj5u.com熱心網友回復:
您可以通過拆分虛線路徑并遵循它來遞回到資料中:
def analyze_data(myvar, dataname):
for dn in dataname.split('.'):
myvar = getattr(myvar, dn)
# Do something with data, e.g.:
print(str(myvar[0]))
這會不斷更新myvar,直到您到達路徑的盡頭。
uj5u.com熱心網友回復:
functools.reduce 是另一種選擇。
>>> from functools import reduce
>>> reduce(getattr, 'subdata.data2'.split('.'), instance1)
[4, 5, 6]
uj5u.com熱心網友回復:
在不更改功能的情況下實作您想要的一種方法是:
class a:
pass
instance1 = a()
# Create 1st data set
instance1.data1 = [1,2,3]
# Create 2nd data set
instance1.subdata = a()
instance1.subdata.data2 = [4,5,6]
def analyze_data(myvar, dataname):
data = getattr(myvar, dataname)
# Do something with data, e.g.:
print(str(data[0]))
analyze_data(instance1, 'data1')
analyze_data(instance1.subdata, 'data2')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/411926.html
標籤:
上一篇:重新定義Python物件方法?
