我正在尝试更多地了解Python - 我目前正在使用3.6.3。
使用kwargs时参数验证/解析的最佳实践是什么?
或者,没有kwargs的参数验证/解析的最佳实践是什么?
class foo:
def __init__(self, **kwargs):
if 'a' in kwargs:
self.a = kwargs['a']
else:
self.a = 0
class bar(foo):
def __init__(self, **kwargs):
super().__init__()
if 'x' in kwargs:
self.x = kwargs['x']
else:
self.x = 23
# b and y are undefined, but my classes use kwargs - what is the best practice for validating / parsing dynamic arguments?
test = bar(b=1,y=24)
答案 0 :(得分:2)
您可以将默认值传递给不在kwargs
字典中的键的get():
def __init__(self, **kwargs):
self.a = kwargs.get("a", 0)
self.x = kwargs.get("x", 23)
# etc.
或者,如果您希望将kwargs
中的任何值设置为类的实例变量,则可以执行以下操作:
def __init__(self, **kwargs):
for k, v in kwargs.items():
self.__setattr__(k, v)
答案 1 :(得分:1)
class Foo:
def __init__(self,a=0):
self.a = a
class Bar(Foo):
def __init__(self,b=21,**kwargs):
self.b = b # accept whatever you want for this child
Foo.__init__(self,**kwargs) # pass remaining kwargs down the line
正是你的Foo类所做的,而且更加清晰
使用kwargs的大多数问题都来自于它根本不是自我记录的事实......我不知道哪些参数可以并且应该为Foo
或Bar
提供哪些参数显式声明具有默认值的参数非常清楚可以传递给函数的选项