簡體   English   中英

使用kwargs(或args)比簡單的dict有什么好處?

[英]What is the benefit of using kwargs (or args) over a simple dict?

我想知道為什么我應該使用kwargs或args而不是傳遞一個簡單的dict(或args中的元組)?

我寫了一個非常簡單的代碼片段來檢查究竟發生了什么,我找不到任何專業人士在字典中使用kwargs。 如果有人能告訴我為什么要使用那些我會很高興。 現在我可以看到它只是更加pythonic但沒有任何區別。 此外,如果你使用一個簡單的字典,那么它更具可讀性,因為所有語言都可以做到,但不是kwargs方式。

def test_normal(input: dict):
    for element in input.items():
        print('Type: {}, raw: {}'.format(type(input), input))
        print('key: {}, value: {}'.format(element[0], element[1]))

def test_kwargs(**kwargs):
    for element in kwargs.items():
        print('Type: {}, raw: {}'.format(type(kwargs), kwargs))
        print('key: {}, value: {}'.format(element[0], element[1]))

test_normal(dict(name='Joseph'))
test_kwargs(name='Joseph')
Type: <class 'dict'>, raw: {'name': 'Joseph'}
key: name, value: Joseph
Type: <class 'dict'>, raw: {'name': 'Joseph'}
key: name, value: Joseph

這些是不同的東西,都有它們的用例。 只是一個經驗法則: 如果它看起來像一個函數參數,它應該是一個函數參數

*args**kwargs有幾個巧妙的用例。 其中一個是傳遞您不關心的參數:

假設您有從Base繼承的類BaseA類:

class Base:
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

class A(Base):
    def __init__(self, n, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.n = n

如你所見, A類並不關心Base__init__參數,所以它只是向前傳遞所有東西(除了它需要的n )。 因此,如果您要更改Base__init__ ,則無需更改A

但是當你創建A對象時,你會正常傳遞參數:

a = A(5, 3, y=6, z=42)

類似的想法是當你實現一個裝飾器,你想在一個具有任何種類和數量的參數的函數上使用它:

def say_hello_first(fn):
    def wrapper(*args, *kwargs):
        print('Hello')
        return fn(*args, **kwargs)
    return wrapper

@say_hello_first
def foo(x):
    print(x)

@say_hello_first
def bar(a, b, c=3.14):
    print((a + b) * c)

然后:

>>> foo(42)
Hello
42

>>> bar(1, 2, c=3)
Hello
9

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM