簡體   English   中英

如何在Python中使用相關關鍵字參數定義函數?

[英]How to define function with dependant keyword arguments in Python?

我有一個帶有1個位置參數和2個關鍵字參數的函數,如下所示:

def foo(arg1, kw_arg1='Keyword Argument', kw_arg2='Keyword Argument'):
    print('The arguments are: {}, {}, {}'.format(arg1, kw_arg1, kw_arg2))

現在,我希望第二個關鍵字參數的默認值kw_arg2取決於kw_arg1 更精確地說,我要的價值kw_arg2默認kw_arg1當它不傳遞給函數foo

需求的功能原型為:

def foo(arg1, kw_arg1='Keyword Argument', kw_arg2=kw_arg1):
    print('The arguments are: {}, {}, {}'.format(arg1, kw_arg1, kw_arg2))

但是,這會在Python 3.6.0上運行時導致NameError

基本解決方案

通過將函數定義為,我找到了解決方法:

def foo(arg1, kw_arg1='Keyword Argument', kw_arg2=None):
    if kw_arg2 is None:
        kw_arg2 = kw_arg1

    print('The arguments are: {}, {}, {}'.format(arg1, kw_arg1, kw_arg2))

但是,從隱含地說明kw_arg1kw_arg2之間的關系的意義上來說,我發現此實現有些限制。 另外,我也失去了將kw_arg2設置為None的能力。

我想知道如何通過一些更明確的解決方法來實現這一目標。

一種實現方法是使用**kwargs ,並要求用戶根據需要將kw_arg2給函數作為關鍵字參數(即,記錄此內容!)。

這樣的好處是,如果用戶向kw_arg2提供Nonekw_arg2 None kw_arg2

這種方法的缺點是用戶必須提供kw_arg2作為關鍵字參數,不能僅僅依靠提供位置參數,而且僅通過查看函數定義,該函數采用什么參數就不那么明顯了。

def foo(arg1, kw_arg1='Keyword Argument', **kwargs):
    """A function that does foo.

    Args:
        arg1: ...
        kw_arg1: ...
        kw_arg2: Will default to the value of kw_arg1 if no 
                 value is passed to this key word argument.
    """
    if 'kw_arg2' in kwargs:
        kw_arg2 = kwargs['kw_arg2']
    else:
        kw_arg2 = kw_arg1
    print('The arguments are: {}, {}, {}'.format(arg1, kw_arg1, kw_arg2))

如果您希望用戶也可以將kw_arg2作為位置參數傳遞, kw_arg2可以嘗試使用* args和** kwargs進行一些欺騙,但是當然這是您需要小心謹慎並平衡潛力的方法濫用與收益:

def foo(arg1, kw_arg1='Keyword Argument', *args, **kwargs):
    """A function that does foo."""
    if 'kw_arg2' in kwargs:
        kw_arg2 = kwargs['kw_arg2']
    elif args:
        kw_arg2 = args[0]
    else:
        kw_arg2 = kw_arg1
    print('The arguments are: {}, {}, {}'.format(arg1, kw_arg1, kw_arg2))

暫無
暫無

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

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