2011-11-11 11 views
10

PEP 8には、スライス演算子はありません。私の理解からは、他の演算子とは異なり、それは空白スタイル、スライス演算子のフォーマット

spam[3:5] # OK 
spam[3 : 5] # NOT OK 

に囲まれてはならない複雑な式を使用している場合、このホールドんが、それは私があなたに同意するものがより良いスタイル

 
    1. spam[ham(66)//3:44+eggs()] 
    2. spam[ham(66) // 3: 44 + eggs()] 
    3. spam[ham(66) // 3 : 44 + eggs()] 
    4. something else? 

答えて

8

を行うことができ、PEP8は明示的にその形式でスライス演算子を言及していないが、spam[3:5]は間違いなく、より一般的とIMHO、より読みやすいです。

pep8 checkerで行くために何かあれば、:前のスペースは

[[email protected]]$ pep8 <(echo "spam[3:44]") # no warnings 
[[email protected]]$ pep8 <(echo "spam[3 : 44]") 
/dev/fd/63:1:7: E203 whitespace before ':' 

をアップフラグが立てられます...しかし、それは文字通りの辞書を定義するための演算子とスペースがないことを:を負いのみのためですオペレータの前に期待される。その理由でspam[3: 44]が通過しますが、それはちょうど正しいとは思われません。

その数については、spam[3:44]に固執します。


ネストされた算術演算は少しトリッキーです。

[[email protected]]$ pep8 <(echo "spam[ham(66)//3:44+eggs()]") 
/dev/fd/63:1:13: E225 missing whitespace around operator 

[[email protected]]$ pep8 <(echo "spam[ham(66) // 3:44 + eggs()]") # OK 

[[email protected]]$ pep8 <(echo "spam[ham(66) // 3 : 44 + eggs()]") 
/dev/fd/63:1:18: E203 whitespace before ':' 

は、しかし、私は一目見ただけで目で解析する上で難しいのすべてを見つける:あなたの3例のうち、唯一の第二1はPEP8検証を渡します。読みやすさとPEP8に準拠して

、私は個人的に行きたい:

spam[(ham(66) // 3):(44 + eggs())] 

以上の合併症操作用:

s_from = ham(66) // 3 
s_to = 44 + eggs() 
spam[s_from:s_to] 
2

考えられている、あります最初の例。後者の場合:PEP 20。可読性は数えます。あなたの複雑なスライス式の意味的に最も重要な部分は、スライス演算子そのものです。式を(人間の読者とインタープリタの両方で)別々に解析する必要がある2つの部分に分割します。したがって私の直感は、:演算子を強調するためにPEP 8との一貫性を犠牲にしなければならないということです。

1. spam[ham(66)/3 : 44+eggs()] 
I 1.が速く見つける対

2. spam[ham(66)/3 : 44 + eggs()] 

:3.質問が増えるの可読性に式の両側内に空白を省略されているかどうかの例のように空白でそれを囲んでパースします。

3

私はPEP8で使用スライシング参照ください:

 
    - Use ''.startswith() and ''.endswith() instead of string slicing to check 
     for prefixes or suffixes. 

     startswith() and endswith() are cleaner and less error prone. For 
     example: 

     Yes: if foo.startswith('bar'): 

     No: if foo[:3] == 'bar': 

私はそれが決定的呼び出すことはありませんが、それはあなたのバックアップ(をし、私の)理解:限り使用するよう

spam[3:5] # OK 

より複雑な状況では、#3を使用します。ノースペースアラウンド・ザ:方法は、そのような場合にはよさそうだとは思わない:

spam[ham(66)/3:44 + eggs()] # looks like it has a time in the middle. Bad. 

あなたは:がより目立つようにしたい場合は、オペレータの間隔を犠牲にしていない、に余分なスペースを追加します:

spam[ham(66)/3 : 44 + eggs()] # Wow, it's easy to read! 

私はオペレータの間隔が好きなので、私は#1を使用することはありません、と#2は、辞書key: value構文のようにあまりにも多く見えます。

私はまたそれをオペレータと呼んでいません。それはsliceオブジェクトを構築するための特別な構文です - あなたはすでに述べたように、あなたはまた、

spam[slice(3, 5)]