6

私は自分のコードを誰にでもできるようにしようとしていますが、入力するのに多くの時間がかかり、コードを読むのにより多くの時間がかかることに気付きました.

それ以外の:

class TextServer(object):
    def __init__(self, text_values):
        self.text_values = text_values
        # <more code>
    # <more methods>

私はこれを書く傾向があります:

class TextServer(object):
    def __init__(self, text_values):
        for text_value in text_values:
            assert isinstance(text_value, basestring), u'All text_values should be str or unicode.'
            assert 2 <= len(text_value), u'All text_values should be at least two characters long.'
        self.__text_values = frozenset(text_values) # <They shouldn't change.>
        # <more code>
    @property
    def text_values(self):
        # <'text_values' shouldn't be replaced.>
        return self.__text_values
    # <more methods>

私のpythonコーディングスタイルは偏執的すぎますか? または、読みやすさを向上させながら、フールプルーフを維持する方法はありますか?

  • 注 1:明確にするために、<との間にコメントを追加しました。>
  • 注 2: コードの悪用を防ごうとしている主な愚か者は、将来の自分です。
4

10 に答える 10

12

このページからの Python イディオムに関するいくつかの良いアドバイスを次に示します。


エラーを回避するのではなくキャッチして、特殊なケースでコードが乱雑になるのを防ぎます。このイディオムは、LBYL (「跳躍する前に見てください」) とは対照的に、EAFP (「許可よりも許しを求めるほうが簡単」) と呼ばれます。これにより、多くの場合、コードが読みやすくなります。例えば:

悪い:

#check whether int conversion will raise an error
if not isinstance(s, str) or not s.isdigit:
    return None
elif len(s) > 10:    #too many digits for int conversion
    return None
else:
    return int(str)

より良い:

try:
    return int(str)
except (TypeError, ValueError, OverflowError): #int conversion failed
    return None

(この場合、先頭の + と - を正しく処理し、20 億から 100 億の間の値 (32 ビット マシンの場合) も正しく処理するため、2 番目のバージョンの方がはるかに優れていることに注意してください)。失敗: 試してみて、適切な例外処理を使用してください。)

于 2009-12-26T15:01:41.853 に答える
9

「私の python コーディング スタイルは偏執的すぎますか? または、読みやすさを向上させながら確実に読みやすくする方法はありますか?」

あなたが自分を守っている愚か者は誰ですか?

君は?自分が書いた API を覚えていないのではないかと心配していますか?

仲間?次のキュービクルの誰かが積極的に API を介して間違ったものを渡そうとするのではないかと心配していますか? この問題を解決するために彼らと話すことができます。ドキュメントを提供すると、多くのコードを節約できます。

あなたのコードをダウンロードし、API ドキュメントを読むことを拒否し、不適切な引数ですべてのメソッドを呼び出す完全な社会病質者ですか? 彼らにどのような支援を提供できますか?

これらのシナリオはすべて、別の方法でより簡単に対処できるため、「誰にでも使える」コーディングはあまり役に立ちません。

あなたが自分自身に対してばかを証明しているなら、それはおそらく賢明ではありません.

同僚や仲間のために間違いを犯している場合は、おそらく彼らと話をして、API ドキュメントを理解していることを確認する必要があります。

API を転覆させようとしている架空の反社会的プログラマーに対して万全を期しているのであれば、あなたにできることは何もありません。パイソンです。彼らはソースを持っています。ソースを編集するだけで物事を壊せるのに、なぜ彼らは API を悪用しようとするのでしょうか?

于 2009-12-26T15:08:03.683 に答える
3

Python では、プライベート インスタンス属性を使用し、それをプロパティを介して公開するのは珍しいことです。を使用するだけself.text_valuesです。

于 2009-12-26T15:08:16.553 に答える
3

あなたのコードは偏執的すぎます (特に、自分自身だけを保護したい場合)。

Python サークルでは、LBYL は一般的に (常にではありませんが) 嫌われています。しかし、(多くの場合、明言されていない) (良い) 単体テストがあるという前提もあります。

私個人?可読性が最も重要だと思います。つまり、あなた自身が読みにくいと思ったら、他の人はどう思うでしょうか?また、可読性の低いコードは、バグをキャッチする可能性も高くなります。作業が難しくなったり、時間がかかったりすることは言うまでもありません(すべての LBYLing でコードが実際に何を行っているかを調べる必要があります)。

于 2009-12-26T15:29:01.067 に答える
2

プライベート変数に時間を費やす代わりにassert、ドキュメントやテストケースに時間を費やすことを好みます。私はドキュメントを読むことを好み、コードを読む必要があるときはテストを読むことを好みます。これは、コードが大きくなるほど真実になります。同時に、テストはあなたに絶対確実なコードと有用なユースケースを提供します。

于 2009-12-26T16:30:21.920 に答える
2

コードを完全に誰にでもできるようにしようとすると、誰かがもっとばかげたものを発明するでしょう。まじめな経験則として、起こりうるエラーを防ぐことは良いことですが、呼び出し元があなたを壊す可能性のある考えられるすべての方法を考えようとしてコードを乱雑にしないでください。

于 2009-12-26T15:35:57.387 に答える
2

エラー チェック コードの必要性は、チェック対象のエラーの結果に基づいています。がらくたデータがシステムに侵入した場合、それを発見するまでにどれくらいの時間がかかりますか? 問題ががらくたデータであると判断するのはどれほど難しいでしょうか? また、修正するのはどれほど難しいでしょうか? あなたが投稿したようなケースの場合、答えは一般的に「長くない」、「難しくない」、「難しくない」です。

しかし、データはどこかに永続化され、複雑なアルゴリズムへの入力として 6 週間で使用されるのでしょうか? 私はそれの地獄をチェックします。

于 2009-12-26T18:55:54.517 に答える
0

引数のチェックに費やしているすべてのエネルギーを、代わりに明確で簡潔なドキュメント文字列を書くことに向けてください。

原子炉用のコードを書いている場合を除きます。その場合は、両方を行っていただければ幸いです。

于 2011-06-07T21:39:30.863 に答える
0

これはpythonに固有のものではないと思います。私は契約による設計を固く信じています。理想的には、すべての機能に明確な事前条件と事後条件が必要です。残念ながら、ほとんどの言語 (Eiffel は正規の例外です) は、これを達成するための特に便利な方法を提供していません。

実際問題として、混乱を避けるために 'checkValues' メソッドを記述する 1 つの方法があり__init__ます。次のように圧縮することもできます。

def __init__(self, text_values):
   self.text_values = checkValues( text_values )

def checkValues(text_values):
   for text_value in text_values:
        assert isinstance(text_value, basestring), u'All text_values should be str or unicode.'
        assert 2 <= len(text_value), u'All text_values should be at least two characters long.'
    return( frozenset( text_values ) )

別のアプローチは、いくつかのコメント規則を使用して前提条件を非表示/表示できる折りたたみ式テキスト エディターを使用することです。これは、ドキュメントの自動生成にも役立ちます。

于 2011-06-06T15:46:24.537 に答える