Pythonでは、クラスメソッドでオプションの引数としてインスタンス変数を使用できる方法はありますか?すなわち:オプション引数としてのPythonインスタンス変数
def function(self, arg1=val1, arg2=val2, arg3=self.instance_var):
# do stuff....
助けてください。
Pythonでは、クラスメソッドでオプションの引数としてインスタンス変数を使用できる方法はありますか?すなわち:オプション引数としてのPythonインスタンス変数
def function(self, arg1=val1, arg2=val2, arg3=self.instance_var):
# do stuff....
助けてください。
これを試してみてください:
クラスの関数定義時あなたは書き換えなければならないとき
def foo(self, blah=None):
if blah is None: # faster than blah == None - thanks to kcwu
blah = self.instance_var
なしには、インスタンスが存在しないため、
def function(self, arg1=val1, arg2=val2, arg3=None):
if arg3 is None:
arg3 = self.instance_var
を以下のように、これはわずかに異なっています元のもの:あなたが本当に欲しいなら、あなたはNone値でarg3を渡すことはできません。
代替ソリューション:
def function(self, arg1=val1, arg2=val2, **argd):
arg3 = argd.get('arg3', self.instance_var)
これを行うための別の方法は、次のようになります。
def foo(self, blah=None):
blah = blah or self.instance_var
つ以上のオプションの引数がある特別な場合に、この短いバージョンは、良く見えます。
注意して使用してください。下記のコメントを参照してください。
blah == 0 – kcwu
またはFalseまたは空の配列...注意:他のコメント者が指摘しているように、 –
が指摘するように、予期せぬ効果があるため、これは実際にPythonではありません。 –
None
を示唆するすべての回答は正しいです。あなたは、発信者が定期的に引数としてNoneを渡すことはできないことを確認したい場合は、is
との特別sentinel
とテストを使用します。
class Foo(object):
__default = object()
def foo(self, blah=Foo.__default):
if blah is Foo.__default: blah = self.instavar
object()
を呼び出すたびに、一意のオブジェクトを作る、is
はそれの間で決して成功しないだろうということなとその他の値。 __default
の2つのアンダースコアは、呼び出し元が混乱しないように気を付けていることを意味する(強く非公開である)ことを意味します(コンパイラが行っている名前の変更を明示的に模倣しています)。
投稿したコードbtwを使用できない理由は、def
ステートメントが評価されたときのデフォルト値の評価です。 def
が評価する時点では、まだインスタンス変数を取得するためのself
はありません。
これはpython 2.5で動作し、blahが空の文字列、リストなどの場合を転送して処理します。
完璧、ありがとう! –
を使用する "比較する"はありません。より良い(そして速い) – kcwu
@kcwu提案に感謝します。私はそれらが異なっていることは分かっていましたが、私はベンチマークを行い、大きなパフォーマンスの違いを発見しました。 – Unknown