オプションパラメータの値がデフォルト値から来ているかどうかをチェックする簡単な方法はありますか?Python:オプションの関数パラメータが設定されているかどうかをチェックする方法
答えて
標準的な方法は、ユーザが渡すことが予想されないデフォルト値を使用することである。 object
インスタンス:それは、ユーザが合格したい値として意味をなさない場合
DEFAULT = object()
def foo(param=DEFAULT):
if param is DEFAULT:
...
通常あなただけの、デフォルト値としてNone
を使用することができます。
代替kwargs
を使用することです:
def foo(**kwargs):
if 'param' in kwargs:
param = kwargs['param']
else:
...
しかしこれは過度に冗長であり、そのドキュメントが自動的にparam
パラメータは含まれませんとして使用するあなたの機能をより困難にします。
ありがとう、私はなしのチェックに固執すると思います。 – Matthias
私はまた、これが必要な箇所にはEllipsis組み込み関数を使用し、Noneは有効な入力とみなされています。これは基本的に最初の例と同じです。 – GrandOpener
私はボラティリティのコメントに同意します。しかし、あなたは次のようにチェックすることができ:
def function(arg1,...,**optional):
if 'optional_arg' in optional:
# user has set 'optional_arg'
else:
# user has not set 'optional_arg'
optional['optional_arg'] = optional_arg_default_value # set default
私はオプションのパラメータは 'def func(optional = value)'のようなものであると信じています。** kwargsではありません –
これは解釈に多少のものです。引数のデフォルト値とキーワード引数の実際の違いは何ですか?それらはどちらも同じ構文 "keyword = value"を使用して表現されます。 – isedev
オプションパラメータと '** kwargs'の目的が少し違うので私は同意しません。 P.S.何も問題はありません-1 :)あなたのための私-1は偶然でした:) –
は少し気まぐれなアプローチは、次のようになります。出力
:
passed default
z
passed different
b
not passed
z
を今、この、私が述べたように、かなり気まぐれですしかし、それは仕事をします。しかし、これは全く読めず、ecatmurのsuggestionと同様に自動的には文書化されません。
'check_f( 'z')'の振る舞いを含めることもできます。 –
@ MichaelJ.Barber良い点。あなたは* argsでいくつかの "魔法"を行わなければなりません。しかし、私の要点は可能だが、デフォルト値が受け渡されるかどうかは今は悪い設計である。 – dmg
次の関数デコレータexplicit_checker
は、明示的に指定されたすべてのパラメータのパラメータ名のセットを作成します。結果を追加パラメータ(explicit_params
)として関数に追加します。パラメータa
が明示的に指定されているかどうかを確認するには、'a' in explicit_params
を実行してください。
def explicit_checker(f):
varnames = f.func_code.co_varnames
def wrapper(*a, **kw):
kw['explicit_params'] = set(list(varnames[:len(a)]) + kw.keys())
return f(*a, **kw)
return wrapper
@explicit_checker
def my_function(a, b=0, c=1, explicit_params=None):
print a, b, c, explicit_params
if 'b' in explicit_params:
pass # Do whatever you want
my_function(1)
my_function(1, 0)
my_function(1, c=1)
時にはユニバーサルユニークな文字列(UUIDなど)を使用します。彼らはので、私は、私はarg
のためにその値を参照するとき、それは渡されなかったことを非常に確信することができしようとした場合
import uuid
DEFAULT = uuid.uuid4()
def foo(arg=DEFAULT):
if arg is DEFAULT:
# it was not passed in
else:
# it was passed in
この方法では、どのユーザーでもデフォルトを推測することができませんでした。
これはちょっとハックですが、簡潔で効果的なものです... – F1Rumors
Pythonオブジェクトは参照であり、 'uuid4()'の代わりに 'object()'を使うことができます - それは依然としてユニークな_instance_です。小切手 –
私はこれを見てきましたパターン数回(例えばライブラリunittest
、py-flags
、jinja
):
class Default:
def __repr__(self):
return "DEFAULT"
DEFAULT = Default()
...または同等のワンライナー...:
DEFAULT = type('Default',(), { '__repr__': lambda x: 'DEFAULT' })()
DEFAULT = object()
とは異なり、これは型チェックを支援し、エラーが発生したときに情報を提供します。エラーメッセージに文字列表現("DEFAULT"
)またはクラス名("Default"
)が頻繁に使用されます。
- 1. 関数呼び出しで引数が指定されているかどうかをチェックする方法は?
- 2. SASオプションまたはODSオプションが設定されているかどうかを確認する方法
- 3. チェックボックスがチェックされているかどうかをチェックする方法
- 4. jqueryを使用してPHPセッションが設定されているかどうかをチェックする方法は?
- 5. pyqtでチェックボックスがチェックされているかどうかチェックする方法
- 6. チェック方法レジストリフォルダが削除されているかどうか
- 7. ArgParseオプションの引数が設定されているかどうかを確認してください(ジュリアで)
- 8. TCLAP:オプションのコマンドライン引数が指定されているかどうかを確認する方法は?
- 9. アラームが設定されているかどうかを確認する方法
- 10. いくつかのプロセスがPythonでタスクマネージャで実行されているかどうかをチェックする方法
- 11. Djangoユーザにパスワードが設定されているかどうかをチェック
- 12. プロパティが構造体に設定されているかどうかチェックする方法
- 13. ラジオボタンがクリックされた後、ラジオボタンが既にチェックされているかどうかをチェックする方法?
- 14. djangoテンプレート変数が定義されているかどうかをチェックする方法は?
- 15. 変数がOctaveで定義されているかどうかをチェックする方法は?
- 16. 実行時にC++のチェック関数がオーバーロードされているかどうか
- 17. 変数が定義されていないかどうかをチェックする方法
- 18. Mathematica:関数に引数が与えられていないかどうかをチェックする方法は?
- 19. ラジオボタンがチェックされているかどうかを確認する方法
- 20. 値が挿入されているかどうかをチェックする方法
- 21. ラジオボタンが選択されているかどうかをチェックする方法は?
- 22. チェックボックスがチェックされているかどうかを確認する方法
- 23. jquery Mobile:チェックボックスがチェックされているかどうかをチェック
- 24. ドキュメントファイルがAndroidでサポートされているかどうかチェックする方法
- 25. Pythonで変数が空であるかどうかをチェックする方法は?
- 26. Pythonユニットテスト設定関数 'が定義されていません'
- 27. VBScript関数が定義されているかどうかを調べる方法はありますか?
- 28. J2MEでチェックボックスがチェックされているかチェックされていないかをチェックする方法は?
- 29. ストアドプロシージャにSQLスクリプトで指定されたパラメータがあるかどうかをチェック
- 30. クラスの特定のインスタンスがjavaで実行されているかどうかをチェックする方法は?
なぜ重要ですか? – Volatility
私はその機能をチェックしたいからです:) – Matthias
デフォルトとして 'None'を使い、それをチェックしてください。実際にこのテストを設定できる場合は、ユーザーがデフォルトの動作を呼び出す値を明示的に渡す可能性も除外します。 –