**kwargs在默认值方面,在Python中使用的正确方法是什么?
kwargs返回字典,但设置默认值的最佳方法是什么,还是有一个?我应该只是作为字典访问它吗?使用get函数?
class ExampleClass:
def __init__(self, **kwargs):
self.val = kwargs['val']
self.val2 = kwargs.get('val2')
Run Code Online (Sandbox Code Playgroud)
一个简单的问题,但我找不到好的资源.人们在我看过的代码中采用不同的方式,并且很难知道要使用什么.
想象一下您想要继承的基类:
class Shape:
def __init__(self, x: float, y: float):
self.x = x
self.y = y
Run Code Online (Sandbox Code Playgroud)
在子类的方法中处理父类的 kwargs 似乎有两种常见的模式__init__。
您可以完全重述父级的界面:
class Circle(Shape):
def __init__(self, x: float, y: float, radius: float):
super().__init__(x=x, y=y)
self.radius = radius
Run Code Online (Sandbox Code Playgroud)
或者,您可以仅指定特定于子级的接口部分,并将剩余的 kwargs 交给父级__init__:
class Circle(Shape):
def __init__(self, radius: float, **kwargs):
super().__init__(**kwargs)
self.radius = radius
Run Code Online (Sandbox Code Playgroud)
这两者似乎都有很大的缺点,所以我很想听听什么是标准或最佳实践。
“重述接口”方法在玩具示例中很有吸引力,就像您在Python 继承的讨论中常见的那样,但是如果我们使用非常复杂的接口(例如pandas.DataFrameor )对某些东西进行子类化怎么办logging.Logger?
另外,如果父接口发生变化,我必须记住更改所有子类的接口以匹配、类型提示等。不是很干。
在这些情况下,您几乎肯定会选择该**kwargs选项。
但该**kwargs选项使用户不确定实际需要哪些参数。
在上面的玩具示例中,用户可能天真地写道:
circle = Circle() # Argument missing for parameter "radius"
Run Code Online (Sandbox Code Playgroud)
他们的 …
为了理解*args和**kwargs我做了一些搜索,当我遇到这个问题时*args和**kwargs?
所选答案下面的答案引起了我的注意,这是:
class Foo(object):
def __init__(self, value1, value2):
# do something with the values
print value1, value2
class MyFoo(Foo):
def __init__(self, *args, **kwargs):
# do something else, don't care about the args
print 'myfoo'
super(MyFoo, self).__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
我在这个例子上尝试了一些东西并以这种方式运行代码:
class Foo(object):
def __init__(self, value1, value2):
# do something with the values
print 'I think something is being called here'
print value1, value2
class MyFoo(Foo):
def __init__(self, *args, **kwargs):
# do something else, don't care about the args
print args, kwargs …Run Code Online (Sandbox Code Playgroud)