簡單的問題;任何想法如何更簡潔地寫這個?我有一個帶有這些(已經初始化的)引數的類,我希望可以選擇更新這些引數。
def update_parameters(self, a=None, g=None, n=None, d=None, s=None, K=None, A=None, L=None):
# If the argument is not none, change the parameter value of the class
if a:
self.a = a
if g:
self.g = g
if n:
self.n = n
if d:
self.d = d
if s:
self.s = s
if K:
self.K = K
if A:
self.A = A
if L:
self.L = L
uj5u.com熱心網友回復:
您可以只使用**args而不是顯式定義所有這些引數。然后,您可以使用setattr()更新任何有效的。
例如:
class Test():
def __init__(self):
self.a = None
self.g = None
self.n = None
def update_parameters(self, **args):
for arg, value in args.items():
if hasattr(self, arg) and value is not None:
setattr(self, arg, value)
def __str__(self):
return f"{self.a}, {self.g}, {self.n}"
t = Test()
t.update_parameters(a=21, z='rubbish', n=100)
t.update_parameters(a=42, n=None)
print(t)
這顯示a并被n更新z并被忽略:
42, None, 100
顯然,您需要將其擴展到所有引數。
供參考:
setattr(x, 'foobar', 123)相當于x.foobar = 123
uj5u.com熱心網友回復:
您可以使用**kwargs并強制用戶僅傳遞關鍵字引數。然后很容易迭代它們并使用setattr():
class A:
def update_parameters(self, **kwargs):
for k, v in kwargs.items():
if v is not None:
setattr(self, k, v)
但這有一個問題,任何非無值都將被添加到實體的字典中。因此,也許您可??以添加另一個檢查以查看是否k有效。
class A:
def update_parameters(self, **kwargs):
for k, v in kwargs.items():
if k in valid_attrs and v is not None:
setattr(self, k, v)
甚至使用實體的__dict__:
def update_parameters(self, **kwargs):
for k, v in kwargs.items():
if k in self.__dict__ and v is not None:
setattr(self, k, v)
這是完整的代碼:
class A:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def update_parameters(self, **kwargs):
for k, v in kwargs.items():
if k in self.__dict__ and v is not None:
setattr(self, k, v)
def __repr__(self):
return f"A(a={self.a}, b={self.b}, c={self.c})"
obj = A(10, 20, 30)
print(obj)
obj.update_parameters(b=40, c=50, d=60)
print(obj)
輸出:
A(a=10, b=20, c=30)
A(a=10, b=40, c=50)
這忽略了d=60值。如果你愿意,你可以提出例外。
uj5u.com熱心網友回復:
制作一個單獨的方法來檢查 None 怎么樣?
def UpdateIfNotNone(To, From):
if From is not None:
To = From
然后原來的方法可以像
def update_parameters(self, a=None, g=None, ...):
worklist = [(self.a,a), (self.g, g) ...]
for task in worklist:
UpdateIfNotNone(task[0], task[1])
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/430948.html
上一篇:R:防止“~”。在線性混合效應模型中,將自變數作為固定效應和隨機效應運行
下一篇:如何更好地組織類的層次結構
