相关疑难解决方法(0)

在Python中使用**kwargs的正确方法

**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)

一个简单的问题,但我找不到好的资源.人们在我看过的代码中采用不同的方式,并且很难知道要使用什么.

python kwargs

415
推荐指数
11
解决办法
35万
查看次数

我应该在子类的 __init__ 中重复父类 __init__ 参数,还是使用 **kwargs 代替

想象一下您想要继承的基类:

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)

他们的 …

python

26
推荐指数
2
解决办法
2845
查看次数

为什么不能在子类的__init__中传递*args和**kwargs

为了理解*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)

python

14
推荐指数
3
解决办法
3万
查看次数

标签 统计

python ×3

kwargs ×1