警告
あなたは、「Python で引数が None として指定されている場合に、引数にデフォルト値を使用する関数を取得する良い方法はありますか?」と尋ねました。
それは良いことではないので、良い方法はないと主張します。None
これは危険な行為です。値を期待する場所に渡されたという事実を合理的に検出したい場合に、厄介なエラーのケースを隠すことができます。この手法が広範囲に使用されているデバッグは恐ろしいものになる可能性があります。 細心の注意を払って使用してください。
可能な方法
例として提供するものよりも多くの機能で機能する一般的なソリューションが必要だと思います。この例None
では、引数値を単純にテストし、必要に応じて置き換えるのが最も簡単です。
一般的なケースを実行するデコレーターを作成できます。これは、inspect ツールボックスを使用して、引数のリスト全体の引数値をデフォルト値で計算し、それらがNone
.
以下のコードは、いくつかの簡単なテスト ケースでアイデアを示しています*args, **kwargs
。これらのケースをカバーするように拡張できます。デフォルトのない引数を通常どおり安全に扱います。
パイソンフィドル
import inspect
def none2defaultdecorator(thisfunc):
(specargs, _, _, defaults) = inspect.getargspec(thisfunc)
def wrappedfunc(*instargs):
callargs = inspect.getcallargs(thisfunc, *instargs)
if len(specargs) != len(callargs):
print "Strange - different argument count in this call to those in spec"
print specargs
print callargs
for i,argname in enumerate(specargs[-len(defaults):]):
try:
if callargs[argname] == None:
callargs[argname] = defaults[i]
except KeyError:
# no local value for this argument - it will get the default anyway
pass
return thisfunc(**callargs)
return wrappedfunc
#Decorate the funtion with the "None replacer". Comment this out to see difference
@none2defaultdecorator
def test(binarg = True, myint = 5):
if binarg == True:
print "Got binarg == true"
elif binarg == False:
print "Got binarg == false"
else:
print "Didn't understand this argument - binarg == ", binarg
print "Argument values - binarg:",binarg,"; myint:",myint
test()
test(False)
test(True)
test(None)
test(None, None)