2016-12-23 4 views
0

Pythonには、関数のオプション引数として渡される関数を実行しない方法がありますこれはいつ実行されるのですか?特定のキーワード引数に一致する現在の図形の現在の軸インスタンスを取得し、または1つを作成Pythonでオプションの引数として渡された関数を自動的に実行しないようにする方法(例: `matplotlib`からplt.gca())

:例えば

は、matplotlibに、関数matplotlib.pyplot.gca(**kwargs)は以下のように定義されます。

私は既にfigureを持っているかどうかによって、新しいものを自動的に作成します。次のコードでは、figureが作成される前に定義されている関数のオプションの引数としてplt.gca()を使用していますが、最初に無駄なものを作成したくない場合は、figureを作成しています。それは希望ない私は私のfigureを作成した後、私の機能を定義した場合):

import matplotlib.pyplot as plt 

# In this case, a useless, empty Figure is created here 
def putAnnotation(mytxt, myax=plt.gca()): 
    myax.annotate(mytxt, xy=(0.5,0.5)) 

fig, [ax0, ax1] = plt.subplots(2,1) 

# If I'd define the function here, there would be no useless Figure created... 
# def putAnnotation(mytxt, myax=plt.gca()): 
#  myax.annotate(mytxt, xy=(0.5,0.5)) 

putAnnotation('Hello', myax=ax1) 

plt.show() 

はの実行時にオプションの引数として渡される関数の「機能」をアクティブにしない方法はありますコード?

答えて

2

を実際にデフォルト引数がされています一度だけ評価される。これはcommon python gotchaであり、あなたがここで必要なものではない可能性が非常に高いです。それを避けるために

、単にプレースホルダとしてNoneを使用します。

def putAnnotation(mytxt, myax=None): 
    if myax is None: 
     myax = plt.gca() 
    myax.annotate(mytxt, xy=(0.5,0.5)) 

あなたがNoneなく合格を区別する必要がある場合は、あなたには、いくつかの*args, **kwargs策略行うことができ、次のいずれか、このことを

def putAnnotation(mytxt, *args, **kwargs): 
    try: 
     myax = args[0] 
    except IndexError: 
     try: 
      myax = kwargs['myax'] 
     except KeyError: 
      myax = plt.gca() 
    myax.annotate(mytxt, xy=(0.5,0.5)) 

注意を複数の値や予期しないキーワードTypeErrorをチェックしません。 それとも、明確なマーカーオブジェクトを使用します。

_putAnnotation_myax_default_marker = object() 
def putAnnotation(mytxt, myax=_putAnnotation_myax_default_marker): 
    if myax is _putAnnotation_myax_default_marker: 
     myax = plt.gca() 
    myax.annotate(mytxt, xy=(0.5,0.5)) 
+0

受け入れ 'ないpassed'場合についての追加ドキュメントのリンクとチップのおかげで(それは、より良いかもしれない@Zulan重要ではないだろう示す?)だけでなく、感謝 @abukajと@MikeMüllerには同じ良い答えがあります! – ztl

+1

NoneとNot passedを区別する方法の2つの例を追加しました。 – Zulan

3

関数plt.gca()は、関数の定義で1回だけ呼び出されます。

複数の軸を使用する場合は危険です。

def putAnnotation(mytxt, myax=None): 
    if myax is None: 
     myax = plt.gca() 
    myax.annotate(mytxt, xy=(0.5,0.5)) 
1

必要な場合にのみ、新しいプロットを作成します:なし軸はputAnnotation()引数として渡されていない場合、それは、あなたが使用することができ、現在の軸を取得するために

def putAnnotation(mytxt, myax=None): 
    if myax is None: 
     myax = plt.gca() 
    myax.annotate(mytxt, xy=(0.5,0.5)) 
関連する問題