[英]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.