2017-08-02 15 views
0

私は念頭に置いてきましたが、私の詳細については何も確定できません。私は必要なものを取り、タプルである必要があります一つは、デフォルト値を持つ2つのオプションのパラメータ、機能を書いている:タプルをデフォルトパラメータとして定義して使用する

def real_titlecase(lineString, delimiter = ' ', no_caps = do_not_cap): 

私はno_capsパラメータタプルが何も渡されていない場合do_not_capをデフォルトにしたいです。私の問題は、私は関数自体の中にdo_not_cap定義したいということであり、それは約50項目含まれています、私はデフ機能の上部にあるドキュメント文字列の下の最初の項目としてdo_not_cap定義しようとしてい

do_not_cap = ('A','a','AN','An','an','THE','The','the', . . .) 

をが、私は得る:

NameError: name 'do_not_cap' is not defined 
関数を呼び出すと、

が返されます。私は、ヘッダでdo_not_capに遭遇し、まだ定義されていないので、乾草のベールからそれを知らないと仮定しています。読みやすさのために、私は実際にヘッダ内にそのタプルを定義したくはありません。私はそれを関数内にカプセル化して、デフォルトとして適切に機能させたいと思います。

どうすればいいですか?

ありがとうございます!

答えて

1

関数のデフォルト値は、関数が定義されているときに定義する必要があります。関数の実行時に作成された値を使用することはできません。それは非常に遅すぎます。

解決策は2つあります。一つは(おそらく、ちょうどその前に)関数の外でデフォルト値のタプルを定義することです:

do_not_cap = ('A', 'a', 'AN', 'An', 'an', 'THE', 'The', 'the', ...) 

def real_titlecase(lineString, delimiter=' ', no_caps=do_not_cap): 
    ... 

あなたはタプルの他の用途を阻止したい場合(例えば、あなたが、それはの一部であることが名前だしたくありませんAPIの場合)、アンダースコアの先頭に「プライベート」という名前を付けることができます(do_not_capの代わりに_do_not_capなど)。

もう1つのオプションは、デフォルト値として特別なセンチネル値(Noneなど)を使用することです。関数の先頭で、センチネルをチェックして、見たい場合にはそのタプルを代入することができます。ユーザーが提供する有効な引数ではないセンチネルを選択する必要があります。 Noneはあなたのサンプル関数でうまくいきますが、Noneがユーザによって渡された場合に意味のある引数になる可能性がある場合は、別の場合には別のセンチネルを使う必要があります。

def real_titlecase(lineString, delimiter=' ', no_caps=None): 
    if no_caps is None: 
     no_caps = ('A', 'a', 'AN', 'An', 'an', 'THE', 'The', 'the', ...) 
    ... 
+0

センチネルを使用すると完全に機能しました。誰もが "None"を渡すことはほとんどありません。彼らはデフォルトの振る舞いを望むならば、パラメータから離れるだけです。少なくともそれはドキュストリングが言うことです。 –

関連する問題