7

検索してみましたが、似たような状況は見つかりませんでした。私はプログラムを書いていますが、これまでのところ、行ルールで79文字以下に固執しています。ただし、いくつかの状況でどこで線を切るかはわかりません。

問題のある領域は次のとおりです。

        self.proc.stdin.write('(SayText "%s")\n' % text.replace('\\', '\\\\').replace('"', '\\"'))

この状況では、'(SayText "%s")\ n'の後に最初の行を分割すると、2番目の行の長さが80文字になります。次に、このように括弧内のどこかで2行目を分割する必要がありますか?

        self.proc.stdin.write('(SayText "%s")\n'
                              % text.replace('\\',
                                             '\\\\').replace('"', '\\"'))

または、次のように3行目全体を最初の角かっこの先頭に配置することをお勧めします。

        self.proc.stdin.write('(SayText "%s")\n'
                              % text.replace('\\',
                              '\\\\').replace('"', '\\"'))

この別の例はここにあります:

        filename = tkFileDialog.askopenfilename(filetypes = (("Word list", "*.tldr"), ("All files", "*.*")))

私はこれをすべきですか?

        filename = tkFileDialog.askopenfilename(filetypes = (("Word list",
                                                              "*.tldr"),
                                                             ("All files",
                                                              "*.*")))

それともこれ?

        filename = tkFileDialog.askopenfilename(filetypes = (("Word list",
                                                "*.tldr"),("All files", "*.*")))

従うべき良い慣習は何でしょうか?

ありがとう。

4

7 に答える 7

4

私の意見では、短い行を好む理由の 1 つは、プログラマーがコードを個々の短い行に分割する可能性が高くなるためです。これにより、理解しやすく、エラーやより良い方法を見つけることができます。

from __future__ import print_function    

FMT_SAY_TEXT = '(SayText "%s")'

text_escaped = text.replace('\\', r'\\')
text_escaped = text_escaped.replace('"', r'\"')
text_out = FMT_SAY_TEXT % text_escaped
print(text_out, file=self.proc.stdin)

2番目の例:

FILE_DIALOG_FILETYPES = (("Word list", "*.tldr"), ("All files", "*.*"))

filename = tkFileDialog.askopenfilename(filetypes = FILE_DIALOG_FILETYPES)
于 2011-10-05T00:35:36.653 に答える
3

原則として、「主要な」構文接続詞の最初のポイントで改行し、通常のステートメントの継続行には 1 つのインデントを使用し、改行の後にコロンが続く場合は 2 つのインデントを使用します。ただし、構文接続詞が「.」の場合。その場合、通常はより明確であるため、一時変数を使用することを好みます。

あなたの例のために:

self.proc.stdin.write('(SayText "%s")\n' % text.replace('\\', '\\\\').replace('"', '\\"'))

私は次のように書きます。

self.proc.stdin.write(
    '(SayText "%s")\n' % text.replace('\\', '\\\\').replace('"', '\\"'))

為に

filename = tkFileDialog.askopenfilename(filetypes = (("Word list", "*.tldr"), ("All files", "*.*")))

私は次のように書きます。

filename = tkFileDialog.askopenfilename(
    filetypes = (("Word list", "*.tldr"), ("All files", "*.*")))

多くの引数を持つ関数呼び出しの場合、1 行に 1 つ配置するのが最も明確な場合があります。例えば

filename = some_function_call_with_long_args( the_first_argument = some_rather_long_expression, another_argument = some_other_expression )

次のようになります。

filename = some_function_call_with_long_args( 
    the_first_argument = some_rather_long_expression, 
    another_argument = some_other_expression )

あるいは:

filename = some_function_call_with_long_args( 
    the_first_argument = some_rather_long_expression, 
    another_argument = some_other_expression 
    )

":" で終了するステートメントのバリエーションを次に示します。

for foo in this_is_a_long_function_generating_an_iterable( here_are_some = arguments, and_they = are_long_too ):
    print foo

になります:

for foo in this_is_a_long_function_generating_an_iterable( 
        here_are_some = arguments, and_they = are_long_too 
        ):
    print foo

しかし、通常はより明確になります

foo_iter = this_is_a_long_function_generating_an_iterable( 
    here_are_some = arguments, and_they = are_long_too )
for foo in foo_iter:
    print foo

また

foo_iter = this_is_a_long_function_generating_an_iterable( 
    here_are_some = arguments, and_they = are_long_too 
    )
for foo in foo_iter:
    print foo

最後の注意: 通常はより大きなウィンドウを使用できるため、これらのルールは時代遅れであると考える人もいます。これらのルールは非常に便利だと思いますが、その理由は次のとおりです。

  • 一貫して短い行で、より多くの開いているウィンドウ (またはより多くの編集ペイン) でコードを見ることができます
  • 上記のメソッドは、プログラムの論理構造を示しています
  • 行を分割するのが容易でない場合、一時変数 (など) を使用すると構造がより適切に表示されるという兆候であることがよくあります。
于 2011-10-05T00:34:03.200 に答える
3

あなたにとって、またはあなたが取り組んでいるコードベースの慣習のために働くものは何でも。 Python 標準ライブラリ に含まれるコードのスタイル ガイドである PEP 8 は、継続行に関する最も重要な考慮事項は、インデントされた行 (新しいブロックを開始する行) と簡単に区別できるようにすることであると示唆しています。

Continuation lines should align wrapped elements either vertically using
Python's implicit line joining inside parentheses, brackets and braces, or
using a hanging indent.  When using a hanging indent the following
considerations should be applied; there should be no arguments on the
first line and further indentation should be used to clearly distinguish
itself as a continuation line.

そこに示されている例を参照してください。

于 2011-10-05T00:35:33.763 に答える
3

通常のインデント スタイルがあまりにも恐ろしい場合に、私が時々従う規則は次のとおりです。

filename = tkFileDialog.askopenfilename(
    filetypes = (("Word list", "*.tldr"),("All files", "*.*"))
)

最初はとても奇妙に見えます。ただし、複数行構造の「頭」が目立つ最初の行に個別に配置され、複数行構造がどこで停止するかが明確に示されています。左中括弧のレベルではなく、1 レベルだけインデントすると、入れ子になった行を書くためのより多くのスペースが得られます。また、そのような呼び出しの引数を変更するだけで差分が明確に表示されるという嬉しい副作用があり、これは時折役に立ちます。

いくつかの点で、このフォーマット規則は、C にさかのぼる傾向がある通常のスタイルよりも、実際には最新の高レベル OO 言語により適していると思います。C には連鎖呼び出しがなく、オブジェクトがないため呼び出し可能な名前がはるかに短い傾向があります。しかし、他の誰もこのスタイルを使用していないので、通常のスタイルが読みやすさを悪化させた場合のフォールバックとして保存しています。

于 2011-10-05T00:37:47.473 に答える
2

一般的な Python コードのフォーマット ガイドラインを探すのに最適な場所はpep8です。長いコード行をいつどのように分割するかについての「ルール」があります。

ただし、特定の例では、通常、前の行で変数に引数を割り当てます。

msg = '(Say Text "%s")\n' % text.replace('\\', '\\\\').replace('"', '\\"')
self.proc.stdin.write(msg)

files_types = (("Word list", "*.tldr"), ("All files", "*.*"))
filename = tkFileDialog.askopenfilename(filetypes=file_types)
于 2011-10-05T00:35:03.767 に答える
1

多くの人がまだVT100を使用しているとは思わないので、安全に 100/120 文字まで増やすことができます。

最初の例のようなものでは、4 つの操作を 2 行 2 行に分割すると読みやすくなります。

myStr = '(SayText "%s")\n' % text.replace('\\', '\\\\')
self.proc.stdin.write(myStr.replace('"', '\\"'))

例 2:

ftypes = (("Word list", "*.tldr"), ("All files", "*.*"))
filename = tkFileDialog.askopenfilename(filetypes = ftypes)
于 2011-10-05T00:34:54.657 に答える
1

それはあなたの好みです。

コーディングするときは、必要に応じて引数で分割することを好みます。もちろん、別のこともできます。それはあなたがどう思うかです。

于 2011-10-05T00:39:11.343 に答える