стиль, форматирование оператора слайса - PullRequest
11 голосов
/ 11 ноября 2011

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?

Ответы [ 3 ]

8 голосов
/ 11 ноября 2011

Как вы уже упоминали, PEP8 явно не упоминает оператор слайса в этом формате, но spam[3:5] определенно более распространен и ИМХО более читабелен.

Если pep8 checker что бы ни проходило, пробел перед : будет помечен как

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

... но это только потому, что предполагается, что : является оператором для определения буквального диктата, а пробел неожидается перед оператором.spam[3: 44] проходит по этой причине, но это не кажется правильным.

На этом счету я бы придерживался spam[3:44].


Вложенные арифметические операции немного сложнее.Из ваших трех примеров только второй проходит проверку PEP8:

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

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

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

Однако я считаю, что все вышеперечисленное трудно проанализировать на первый взгляд.

Для удобства чтения и соответствияPEP8, я бы лично выбрал:

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

Или для более сложных операций:

 s_from = ham(66) // 3 
 s_to = 44 + eggs()
 spam[s_from:s_to]
3 голосов
/ 11 ноября 2011

Я вижу срезы, используемые в 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)]
2 голосов
/ 11 ноября 2011

Я согласен с вашим первым примером. Для последнего: PEP 20 . Читаемость имеет значение. Семантически наиболее важной частью вашего сложного выражения среза является сам оператор среза, он делит выражение на две части, которые должны быть проанализированы (как читателем, так и интерпретатором) по отдельности. Поэтому моя интуиция заключается в том, что согласованность с PEP 8 должна быть принесена в жертву, чтобы выделить оператор :, т.е. окружив его пробелами, как в примере 3. Вопрос в том, пропустить ли пробелы в двух сторонах выражения, чтобы повысить читабельность или нет:

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

против

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

нахожу 1. быстрее разбирать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...