2009-05-15 10 views

答えて

14

これを試してみてください:

クラスの関数定義時あなたは書き換えなければならないとき

def foo(self, blah=None): 
    if blah is None: # faster than blah == None - thanks to kcwu 
     blah = self.instance_var 
+0

完璧、ありがとう! –

+4

を使用する "比較する"はありません。より良い(そして速い) – kcwu

+0

@kcwu提案に感謝します。私はそれらが異なっていることは分かっていましたが、私はベンチマークを行い、大きなパフォーマンスの違いを発見しました。 – Unknown

2

なしには、インスタンスが存在しないため、

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) 
-1

これを行うための別の方法は、次のようになります。

def foo(self, blah=None): 
    blah = blah or self.instance_var 

つ以上のオプションの引数がある特別な場合に、この短いバージョンは、良く見えます。

注意して使用してください。下記のコメントを参照してください。

+0

blah == 0 – kcwu

+0

またはFalseまたは空の配列...注意:他のコメント者が指摘しているように、 –

+0

が指摘するように、予期せぬ効果があるため、これは実際にPythonではありません。 –

5

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はありません。

0

これはpython 2.5で動作し、blahが空の文字列、リストなどの場合を転送して処理します。

関連する問題