簡體   English   中英

Function 關鍵字作為默認參數

[英]Function with keyword as default argument

我正在用一些kwargs定義一個 function 。 我知道將未定義的變量作為kwarg默認值會引發錯誤。 例如:

# This is fine
def foo(word='Ni!'):
    print(word)
foo()
> Ni!

# This won't work
def foo(word=it):
    print(word)
it = 'Ni!'
foo()
> (gives an error)

但是有什么方法可以使用kwarg本身的關鍵字作為默認值變量名,並期望在調用 function 時已經定義它?

# This is what I want
def foo(word=word):
    print(word)
word = 'Ni!'  # Note it's defined after function definition, but before function call
foo()
> Ni!

(我在尋找這個問題的答案時遇到了麻煩,如果它已經在某個地方得到了回答,我們深表歉意!)

使用全局將是一種選擇。 但我認為使用 function 屬性可以提供更干凈的解決方案:

def foo(word=None):  # use 'None' as sentinel
    if word is not None:
        print(word)
    else:  # get the current default value from a function attribute
        print(getattr(foo, 'default_word', 'default'))


foo()  # use default first time
foo.default_word = 'changed default'  # change the default
foo()  # gets the new default
foo('hi')  # use argument

結果:

default
changed default
hi

裝飾器是一個可能的選擇:

from functools import wraps


def kwd_load_globals(**kwd2name):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            f_globals = func.__globals__
            for kwd in kwd2name.keys() - kwargs.keys():
                try:
                    kwargs[kwd] = f_globals[kwd2name[kwd]]
                except KeyError:
                    pass
            return func(*args, **kwargs)
        return wrapper
    return decorator


@kwd_load_globals(word='word')
def foo(word):
    print(word)


word = 1
foo()    # 1

但是有什么方法可以使用 kwarg 本身的關鍵字作為默認值變量名,並期望在調用 function 時已經定義它?

這里的簡短答案是否定的,您嘗試做的事情不可能以這種確切的方式進行。 這是因為當解釋器將 function 名稱設置為def object 的值時,必須在定義時知道默認值。

暫無
暫無

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

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