2017-10-24 3 views
1
def clean_word(word): 
    chars_to_clean = {',', ':', '.','/'} #static? 
    res = '' 
    for c in word: 
     if c not in chars_to_clean: 
      res += c 
    return res 

C++では、chars_to_cleanstaticと宣言していましたので、その範囲を最小限に抑えて、もう一方の割り当てを繰り返すことはできません。 Pythonでこれらの目標を達成するにはどうしたらいいですか?静的関数変数(小スコープ、単一初期化)のPythonの方法ですか?

私はchars_to_cleanをクラス変数にすることができましたが、できるだけスコープを小さくしたいと思います。
私はそれを関数の属性にすることができますが、私は割り当てがすべての呼び出しで繰り返されると思います。

+1

変数名の前に '__'を付けると、pythonがそれを悪用するようになります。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅありがとう、私はそれは完全な答え、特にあなたが混乱を説明する価値があると思う:) – davka

答えて

2

あなたは

にコードが微細なである必要はありません。あなたはそれを投稿しました(スコープは最小限に抑えられ、小さなセットの作成には時間がかかりません)。

ただし、コードを変更したい場合は、

あなた場合("Least Astonishment" and the Mutable Default Argumentを参照)chars_to_cleanセットの回避繰り返し作成のように、あなたは次のことを行うことができ、それをデフォルトのパラメータ

ください:

def clean_word(word, chars_to_clean = {',', ':', '.','/'}) 
    res = '' 
    for c in word: 
     if c not in chars_to_clean: 
      res += c 
    return res 

セットがcratedされる。この方法をPythonが関数定義を読み込んだときに一度だけ呼び出され、関数を再利用して別の文字を消去することができます。これは危険です、もしあなたがここでやっていないセットを突然変更するなら(偶然)

あなたはこの変数が一定であること(慣例により)それを明確にしたい場合は、すべて大文字に変数名を変更することが大文字

作ると範囲について

メイクを気にしないでくださいそれは文字列

あなたは"a" in "abcde"をpythonで行うことができます。これを文字列から文字列に変更することで、は変更不可能にすることができます。あなたは偶然の再割り当て/変更を避けたい場合は、セッターせずにクラスのプロパティ作るセッター

せずにクラスのプロパティください

(再割り当てはまだことは可能です)。しかし、この解決策はおそらく過剰なものです。この場合

class A: 
    @property 
    def chars_to_clean(self): 
     return ",:./" 

、あなたはまだA.chars_to_clean = "abc"を行うことができますが、A().chars_to_clean="asd"A().chars_to_clean[0]=wが原因の文字列の不変性に、欠落が原因セッターに第一、第二のエラーが発生します。

+0

ありがとう、たくさんの良い提案!私はあなたが正しいと思いますが、この関数は多くのテキストファイルのすべての単語に対して呼び出されるため、時期尚早であっても明白な場所を保存したいと思います最適化。 – davka

+0

とリンクに感謝:) – davka

1

関数はオブジェクトであるため、オブジェクトの属性を設定して使用することができます。彼らは "プライベート"ではありませんが、コードを読むときには密接に関連していることがわかります。

だから、そのような何か:

def clean_word(word): 
    res = '' 
    for c in word: 
     if c not in clean_word.chars_to_clean: 
      res += c 
    return res 

clean_word.chars_to_clean = {',', ':', '.','/'} 

あなたが関数を定義した後chars_to_cleanを定義するために持っているとしてそれは非常にエレガントではありません。

関数を定義しているときに属性を定義する別のオプションが、チェックはhasattrは、いずれかの非常に素晴らしいではありません。

def clean_word(word): 
    if not hasattr(clean_word, 'chars_to_clean'): 
     clean_word.chars_to_clean = {',', ':', '.','/'}  
    res = '' 
    for c in word: 
     if c not in clean_word.chars_to_clean: 
      res += c 
    return res 
関連する問題