E251 unexpected spaces around keyword parameter equals как исправить

When i check source i got: pep8.exe --show-source bazarviews.py bazarviews.py:20:38: E251 no spaces around keyword / parameter equals p = Category.objects.get(id = categoryId) ^ bazarviews.py:97...

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and
privacy statement. We’ll occasionally send you account related emails.

Already on GitHub?
Sign in
to your account


Closed

parasit opened this issue

Jun 20, 2010

· 6 comments


Closed

Problems with whitespaces E251 and E202

#12

parasit opened this issue

Jun 20, 2010

· 6 comments

Comments

@parasit

When i check source i got:
pep8.exe —show-source bazarviews.py
bazarviews.py:20:38: E251 no spaces around keyword / parameter equals
p = Category.objects.get(id = categoryId)
^
bazarviews.py:97:42: E202 whitespace before ‘)’
customData = json.dumps(resp)

But in both cases something is wrong, in first there are spaces, and in second dont.
Its error in checker or its my mistake?

Source in UTF-8 with unix (n) end of lines.
pep8 v. 0.5.0
python 2.6.1
OS: WinXP

@florentx

For the first one (E251), the message says that the correct syntax is:

p = Category.objects.get(id=categoryId)

For the E202 case, it complains about an extra whitespace before ‘)’.
If you can reproduce this issue with a very short snippet, please paste it here.
(or use a pastebin)

@bbrodriges

I’ve faced the same problem in my code.
Here’s a snippet:

def set_cookie(self, uid):

        '''Sets user cookie based on uid.'''

        response.set_cookie(
                '__utmb',
                uid,
                secret = self.COOKIE_SECRET_KEY,
                expires = time.time() + (3600 * 24 * 365),
                domain = '.mydomain.com',
                path = '/'
        )

And here is a traceback:

users.py:163:23: E251 no spaces around keyword / parameter equals
                secret = self.COOKIE_SECRET_KEY,
                      ^

pep8 0.6.1, python 2.7.2

@bbrodriges

My mistake, I have found error.

@franciscolourenco

@sigmavirus24

@aristidesfl when using keyword arguments/parameters in function calls you should not have spaces around the equal sign as per PEP8.

It should be

# snip
secret=self.COOKIE_SECRET_KEY,
expires=time.time() + (3600 * 24 * 365),
domain='.mydomain.com',
path='/'

I hope that helps.

@bbrodriges

I’m a Python beginner, I read pep standards which must follow while programming in python
http://legacy.python.org/dev/peps/pep-0008

Now I have a doubt. As they have mentioned that you should not put spaces around the equal sign while using keyword argument or a default parameter value in functions or Dict.

For example

YES

def myfunc(key1=val1, key2=val2, key3=val3)

NO

def myfunc(key1 = val1, key2 = val2, key3 = val3)

Thats fine but what if I break down these in multiple lines. something like this(when we have many parameters or long name)

def myfunc(key1=val1,
key2=val2,
key3=val3)

In this case, I think, we should put space around the equal sign. am I correct. because these all are about readability but I’m just curious if there is standard for this too. Looking for best practices.

Same thing for Dict.

new_dict= Dict(
       key1=val1, 
       key2=val2, 
       key3=val3
)

And should I put a comma after last argument in dict unlike example mentioned above, I didn’t put a comma after last value (key3=val3)

asked Jul 17, 2014 at 18:18

user3810188's user avatar

user3810188user3810188

3011 gold badge3 silver badges14 bronze badges

1

Thats fine but what if I break down these in multiple lines. something like this(when we have many parameters or long name)

def myfunc(key1=val1, 
       key2=val2, 
       key3=val3)

In the code you give, you are not putting whitespace around the =, so you are complying with pep8 in respect of operator spacing (your indentation does not comply with pep8).

In general, you can write your code however you like. If you don’t comply with pep8, other people generally won’t find your code as easy to read. If you have local standards within your company, that should supercede pep8. If you don’t have standards that direct you to violate pep8, your colleagues will likely hate you for breaking pep8.

If you don’t have a standard at all, future you will also hate present you.

answered Jul 17, 2014 at 18:23

Marcin's user avatar

MarcinMarcin

47.9k17 gold badges127 silver badges199 bronze badges

PEP8 clearly says:

Don’t use spaces around the = sign when used to indicate a keyword
argument or a default parameter value.

You don’t need to put white spaces around the equal sign in both cases.

If you are not sure whether your code follows PEP8 standard or not, use flake8 static code analysis tool. It would raise warnings in case of code style violations.

Example:

Consider you have extra whitespaces around the equal signs:

def myfunc(key1 = 'val1',
           key2 = 'val2',
           key3 = 'val3'):
    return key1, key2, key3

flake8 outputs a warning for every unexpected whitespace:

$ flake8 test.py
test.py:3:16: E251 unexpected spaces around keyword / parameter equals
test.py:3:18: E251 unexpected spaces around keyword / parameter equals
test.py:4:16: E251 unexpected spaces around keyword / parameter equals
test.py:4:18: E251 unexpected spaces around keyword / parameter equals
test.py:5:16: E251 unexpected spaces around keyword / parameter equals
test.py:5:18: E251 unexpected spaces around keyword / parameter equals

answered Jul 17, 2014 at 18:26

alecxe's user avatar

alecxealecxe

455k116 gold badges1061 silver badges1180 bronze badges

7

No. Don’t put spaces around equal signs when declaring kwargs. Think of it this way: If you are just skimming lines of code, you want to train your eyes to see the difference between the assignment operator used during ordinary program flow (spam = True) and a kwarg, especially if it’s on its own line (spam=True).

As for a trailing comma, I have always felt that a trailing comma suggests to a fellow team member or reader that I feel the list, dict, set of args, etc. might be subject to expansion in the future. If I’m fairly certain that the structure represents its mature state, I remove it.

answered Jul 17, 2014 at 18:23

jMyles's user avatar

jMylesjMyles

11.6k6 gold badges42 silver badges56 bronze badges

1

palachevskiy

0 / 0 / 0

Регистрация: 15.05.2020

Сообщений: 9

1

15.05.2020, 16:57. Показов 7149. Ответов 4

Метки нет (Все метки)


Python
1
2
3
4
5
6
7
8
9
10
HeroPhrases = {}
 
while (line := input()) != "!ВСЁ":
    hero, phrase = line.split(": ")
    if hero not in HeroPhrases:
        HeroPhrases[hero] = []
    HeroPhrases[hero].append(phrase)
 
for hero, phrases in HeroPhrases.items():
    print(f"{hero} - {'; '.join(reversed(phrases))}")

./solution.py:3:12: E203 whitespace before ‘:’
./solution.py:3:13: E231 missing whitespace after ‘:’
./solution.py:3:13: E999 SyntaxError: invalid syntax
./solution.py:3:15: E251 unexpected spaces around keyword / parameter equals

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Эксперт Python

5403 / 3827 / 1214

Регистрация: 28.10.2013

Сообщений: 9,554

Записей в блоге: 1

15.05.2020, 17:05

2

отфармотировать по стандарту PEP8

Может, сначала сдашь русский?

И еще: ты видел, что люди выкладывают сюда код в тегах Python кода, а не тупой нечитабельной лапшой?



1



Просто Лис

Эксперт Python

4830 / 3152 / 991

Регистрация: 17.05.2012

Сообщений: 9,186

Записей в блоге: 9

15.05.2020, 17:28

3

PyCharm -> ctrl+L



0



unfindable_404

Эксперт Python

683 / 466 / 204

Регистрация: 22.03.2020

Сообщений: 1,051

15.05.2020, 17:54

4

Дело не в PEP8. Код, который вы запускаете, поддерживается только Python3.8. Но вы запускаете его на Python более старой версии. Отсюда и ошибки. Я поправил.

Python
1
2
3
4
5
6
7
8
9
10
11
12
HeroPhrases = {}
 
line = input()
while line != "!ВСЁ":
    hero, phrase = line.split(": ")
    if hero not in HeroPhrases:
        HeroPhrases[hero] = []
    HeroPhrases[hero].append(phrase)
    line = input()
 
for hero, phrases in HeroPhrases.items():
    print(f"{hero} - {'; '.join(reversed(phrases))}")



2



Нарушитель

Эксперт PythonЭксперт Java

14040 / 8228 / 2485

Регистрация: 21.10.2017

Сообщений: 19,708

16.05.2020, 18:38

5

Цитата
Сообщение от Рыжий Лис
Посмотреть сообщение

PyCharm -> ctrl+L

Ctrl+Alt+L



2



В первой части статьи мы разобрались, почему качество кода имеет такое большое значение, какой код можно считать качественным и на какие стандарты можно ориентироваться.

Теперь давайте подробнее рассмотрим,
на что способны различные линтеры и как
выглядит результат их работы. Для этого
пропустим одинаковый код через несколько
линтеров с дефолтными настройками.

Проверять будем следующий код. В нем
есть целый ряд логических и стилистических
ошибок:

"""
code_with_lint.py
Example Code with lots of lint!
"""
import io
from math import *


from time import time

some_global_var = 'GLOBAL VAR NAMES SHOULD BE IN ALL_CAPS_WITH_UNDERSCOES'

def multiply(x, y):
    """
    This returns the result of a multiplation of the inputs
    """
    some_global_var = 'this is actually a local variable...'
    result = x* y
    return result
    if result == 777:
        print("jackpot!")

def is_sum_lucky(x, y):
    """This returns a string describing whether or not the sum of input is lucky
    This function first makes sure the inputs are valid and then calculates the
    sum. Then, it will determine a message to return based on whether or not
    that sum should be considered "lucky"
    """
    if x != None:
        if y is not None:
            result = x+y;
            if result == 7:
                return 'a lucky number!'
            else:
                return( 'an unlucky number!')

            return ('just a normal number')

class SomeClass:

    def __init__(self, some_arg,  some_other_arg, verbose = False):
        self.some_other_arg  =  some_other_arg
        self.some_arg        =  some_arg
        list_comprehension = [((100/value)*pi) for value in some_arg if value != 0]
        time = time()
        from datetime import datetime
        date_and_time = datetime.now()
        return

В таблице ниже мы разместили список
используемых линтеров и время, которое
им понадобилось на анализ этого файла.
Следует отметить, что все эти инструменты
служат разным целям, поэтому сравнивать,
возможно, не совсем правильно. PyFlakes,
например, не выявляет стилистические
ошибки, как это делает Pylint.

Линтер Команда Время
Pylint pylint code_with_lint.py 1,16 с
PyFlakes pyflakes code_with_lint.py 0,15 с
pycodestyle pycodestyle code_with_lint.py 0,14 с
pydocstyle pydocstyle code_with_lint.py 0,21 с

Теперь давайте посмотрим на результаты.

Pylint

Pylint это один из самых старых линтеров
(работает с 2006 года), но при этом он хорошо
поддерживается. Можно сказать, что этот
инструмент проверен временем. Контрибьюторы
уже давно пофиксили все основные баги,
а главный функционал хорошо отшлифовали.

Самые распространенные жалобы на
Pylint — медленная работа, излишняя
многословность по умолчанию и необходимость
долго копаться в настройках, чтобы
сделать все по своему вкусу. Если
отбросить скорость работы, все остальные
пункты — палка о двух концах. Многословность
объясняется скрупулезностью. Большое
количество настроек позволяет подогнать
под свои нужды очень многие вещи.

Итак, вот результат запуска Pylint для
приведенного выше кода:

No config file found, using default configuration
************* Module code_with_lint
 W: 23, 0: Unnecessary semicolon (unnecessary-semicolon)
 C: 27, 0: Unnecessary parens after 'return' keyword (superfluous-parens)
 C: 27, 0: No space allowed after bracket
                 return( 'an unlucky number!')
                       ^ (bad-whitespace)
 C: 29, 0: Unnecessary parens after 'return' keyword (superfluous-parens)
 C: 33, 0: Exactly one space required after comma
     def __init__(self, some_arg,  some_other_arg, verbose = False):
                                ^ (bad-whitespace)
 C: 33, 0: No space allowed around keyword argument assignment
     def __init__(self, some_arg,  some_other_arg, verbose = False):
                                                           ^ (bad-whitespace)
 C: 34, 0: Exactly one space required around assignment
         self.some_other_arg  =  some_other_arg
                              ^ (bad-whitespace)
 C: 35, 0: Exactly one space required around assignment
         self.some_arg        =  some_arg
                              ^ (bad-whitespace)
 C: 40, 0: Final newline missing (missing-final-newline)
 W:  6, 0: Redefining built-in 'pow' (redefined-builtin)
 W:  6, 0: Wildcard import math (wildcard-import)
 C: 11, 0: Constant name "some_global_var" doesn't conform to UPPER_CASE naming style (invalid-name)
 C: 13, 0: Argument name "x" doesn't conform to snake_case naming style (invalid-name)
 C: 13, 0: Argument name "y" doesn't conform to snake_case naming style (invalid-name)
 C: 13, 0: Missing function docstring (missing-docstring)
 W: 14, 4: Redefining name 'some_global_var' from outer scope (line 11) (redefined-outer-name)
 W: 17, 4: Unreachable code (unreachable)
 W: 14, 4: Unused variable 'some_global_var' (unused-variable)
 …
 R: 24,12: Unnecessary "else" after "return" (no-else-return)
 R: 20, 0: Either all return statements in a function should return an expression, or none of them should. (inconsistent-return-statements)
 C: 31, 0: Missing class docstring (missing-docstring)
 W: 37, 8: Redefining name 'time' from outer scope (line 9) (redefined-outer-name)
 E: 37,15: Using variable 'time' before assignment (used-before-assignment)
 W: 33,50: Unused argument 'verbose' (unused-argument)
 W: 36, 8: Unused variable 'list_comprehension' (unused-variable)
 W: 39, 8: Unused variable 'date_and_time' (unused-variable)
 R: 31, 0: Too few public methods (0/2) (too-few-public-methods)
 W:  5, 0: Unused import io (unused-import)
 W:  6, 0: Unused import acos from wildcard import (unused-wildcard-import)
 …
 W:  9, 0: Unused time imported from time (unused-import)

Имейте в виду, что похожие строки в
тексте заменены многоточиями. Разобраться
довольно сложно, но в этом коде много
ошибок.

Обратите внимание, что Pylint добавляет
к каждой проблемной области префикс R,
C, W, E или F, что означает:

  • [R]efactor — нужен рефакторинг, поскольку
    показатель «good practice» не на должном
    уровне.
  • [C]onvention — нарушение соглашения о
    стандарте кода
  • [W]arning — предупреждение о стилистических
    проблемах или минорных программных
    проблемах
  • [E]rror — существенные проблемы в
    программе (скорее всего баг)
  • [F]atal — ошибки, мешающие дальнейшей
    работе.

Приведенный список — из пользовательского
руководства Pylint.

PyFlakes

Pyflakes «торжественно клянется никогда
не жаловаться на стиль и очень усердно
стараться не допускать ложнопозитивных
срабатываний». То есть Pyflakes не сообщит
вам о пропущенных docstrings или о том, что
имена аргументов не соответствуют стилю
нейминга. Он фокусируется на логических
проблемах в коде и потенциальных ошибках.

Преимущество этого инструмента в
скорости. PyFlakes обработал файл лишь за
небольшую долю времени, которое
потребовалось Pylint.

Вывод после запуска Pyflakes для приведенного
выше кода:

code_with_lint.py:5: 'io' imported but unused
code_with_lint.py:6: 'from math import *' used; unable to detect undefined names
code_with_lint.py:14: local variable 'some_global_var' is assigned to but never used
code_with_lint.py:36: 'pi' may be undefined, or defined from star imports: math
code_with_lint.py:36: local variable 'list_comprehension' is assigned to but never used
code_with_lint.py:37: local variable 'time' (defined in enclosing scope on line 9) referenced before assignment
code_with_lint.py:37: local variable 'time' is assigned to but never used
code_with_lint.py:39: local variable 'date_and_time' is assigned to but never used

Недостаток Pyflakes в том, что в результатах
его работы немного труднее разобраться.
Различные проблемы и ошибки никак не
помечены и не упорядочены. Но будет ли
это для вас проблемой, зависит от вашего
использования этого инструмента.

pycodestyle (прежде — pep8)

Этот инструмент проверяет код на соответствие некоторым соглашениям из PEP 8. Нейминг не проверяется, так же как и docstrings. Ошибки и предупреждения, выдаваемые этим инструментом, можно посмотреть в таблице.

Результат использования pycodestyle для
приведенного выше кода:

code_with_lint.py:13:1: E302 expected 2 blank lines, found 1
code_with_lint.py:15:15: E225 missing whitespace around operator
code_with_lint.py:20:1: E302 expected 2 blank lines, found 1
code_with_lint.py:21:10: E711 comparison to None should be 'if cond is not None:'
code_with_lint.py:23:25: E703 statement ends with a semicolon
code_with_lint.py:27:24: E201 whitespace after '('
code_with_lint.py:31:1: E302 expected 2 blank lines, found 1
code_with_lint.py:33:58: E251 unexpected spaces around keyword / parameter equals
code_with_lint.py:33:60: E251 unexpected spaces around keyword / parameter equals
code_with_lint.py:34:28: E221 multiple spaces before operator
code_with_lint.py:34:31: E222 multiple spaces after operator
code_with_lint.py:35:22: E221 multiple spaces before operator
code_with_lint.py:35:31: E222 multiple spaces after operator
code_with_lint.py:36:80: E501 line too long (83 > 79 characters)
code_with_lint.py:40:15: W292 no newline at end of file

Что здесь хорошо, это то, что ошибки
имеют метки категорий. Вы можете
игнорировать определенные ошибки, если
соответствие какому-то конкретному
соглашению вас не заботит.

pydocstyle (прежде — pep257)

Этот инструмент очень похож на предыдущий, pycodestyle, за исключением того, что проверяет код не на соответствие PEP 8, а на соответствие PEP 257.

Результат запуска для приведенного
выше кода:

code_with_lint.py:1 at module level:
         D200: One-line docstring should fit on one line with quotes (found 3)
 code_with_lint.py:1 at module level:
         D400: First line should end with a period (not '!')
 code_with_lint.py:13 in public function `multiply`:
         D103: Missing docstring in public function
 code_with_lint.py:20 in public function `is_sum_lucky`:
         D103: Missing docstring in public function
 code_with_lint.py:31 in public class `SomeClass`:
         D101: Missing docstring in public class
 code_with_lint.py:33 in public method `__init__`:
         D107: Missing docstring in __init__

Как и pycodestyle, pydocstyle помечает и разбивает
по категориям найденные ошибки. Этот
список не конфликтует ни с чем из
pycodestyle, поскольку все ошибки имеют
приставку D (означающую docstring). Список
ошибок можно посмотреть здесь.

Код без ошибок

Если учесть предупреждения и исправить
ошибки, найденные линтерами, вы получите
примерно такой код:

"""Example Code with less lint."""

from math import pi
from time import time
from datetime import datetime

SOME_GLOBAL_VAR = 'GLOBAL VAR NAMES SHOULD BE IN ALL_CAPS_WITH_UNDERSCOES'


def multiply(first_value, second_value):
    """Return the result of a multiplation of the inputs."""
    result = first_value * second_value

    if result == 777:
        print("jackpot!")

    return result


def is_sum_lucky(first_value, second_value):
    """
    Return a string describing whether or not the sum of input is lucky.

    This function first makes sure the inputs are valid and then calculates the
    sum. Then, it will determine a message to return based on whether or not
    that sum should be considered "lucky".
    """
    if first_value is not None and second_value is not None:
        result = first_value + second_value
        if result == 7:
            message = 'a lucky number!'
        else:
            message = 'an unlucky number!'
    else:
        message = 'an unknown number! Could not calculate sum...'

    return message


class SomeClass:
    """Is a class docstring."""

    def __init__(self, some_arg, some_other_arg):
        """Initialize an instance of SomeClass."""
        self.some_other_arg = some_other_arg
        self.some_arg = some_arg
        list_comprehension = [
            ((100/value)*pi)
            for value in some_arg
            if value != 0
        ]
        current_time = time()
        date_and_time = datetime.now()
        print(f'created SomeClass instance at unix time: {current_time}')
        print(f'datetime: {date_and_time}')
        print(f'some calculated values: {list_comprehension}')

    def some_public_method(self):
        """Is a method docstring."""
        pass

    def some_other_public_method(self):
        """Is a method docstring."""
        pass

Согласно «мнению» приведенных выше
линтеров, этот код больше не имеет
«ворсинок». И хотя логика сама по себе
бессмысленная, вы можете заметить, что,
как минимум, этот код отличается
единообразием.

В рассмотренном случае мы запускали
линтеры на уже написанном коде. Но это
не единственный способ проверки качества
кода.

Когда можно проверять качество
кода?

Вы можете проверять качество своего
кода:

  • по мере написания,
  • перед отправкой,
  • при запуске тестов.

Проверять код при помощи линтеров
лучше почаще. Если в многочисленной
команде или на большом проекте такие
проверки не автоматизированы, там будет
легко упустить из виду ухудшение качества
кода. Оно происходит постепенно, конечно.
Какая-нибудь плохо прописанная логика,
какой-то код, формат которого не
соответствует соседнему коду. Со временем
все эти шероховатости накапливаются,
и в конечном итоге у вас на руках может
оказаться трудночитаемый, трудноисправляемый
и гарантирующий головную боль при
поддержке код с кучей багов.

Чтобы этого избежать, проверяйте
качество кода почаще!

Проверка кода по мере его
написания

Вы можете использовать линтеры по
мере написания кода, но для этого может
понадобиться дополнительно настроить
вашу среду разработки. Чаще всего вам
нужно будет найти подходящий плагин
для вашей IDE или редактора. Но большинство
IDE имеют и встроенные линтеры.

По ссылкам вы сможете найти полезную
информацию по этой теме для разных
редакторов:

  • Sublime Text
  • VS Code
  • Atom
  • Vim
  • Emacs

Проверка кода перед его
отправкой

Если вы используете Git, можно настроить
Git hooks для запуска линтеров перед коммитом.
Другие системы контроля версий имеют
схожие методы для запуска скриптов в
привязке к определенным действиям в
системе. При помощи этих методов можно
блокировать любой новый код, не
соответствующий стандартам качества.

Это может показаться слишком радикальным
подходом, но прогон каждого кусочка
кода через линтеры — важный шаг на пути
к обеспечению стабильно высокого
качества. Автоматизация этих проверок
— лучший способ избежать шероховатостей
в коде.

При запуске тестов

Вы можете вставить линтеры в любую систему, которую используете для непрерывной интеграции. Линтеры при этом могут быть настроены таким образом, чтобы сборка в принципе не была возможна, если код не соответствует стандартам.

Опять же, это может показаться слишком
радикальным решением, особенно если в
уже существующем коде есть много ошибок,
вылавливаемых линтерами. Но эту проблему
можно обойти. В некоторых системах
непрерывной интеграции можно выбрать
опцию, при которой сборка проваливается
только если новый код увеличивает число
ошибок, найденных линтером. Таким образом
вы сможете улучшать качество кода, не
переписывая заново всю кодовую базу.

Заключение

Высококачественный код делает то, что
он должен делать, не ломаясь при этом.
Его легко читать, поддерживать и
расширять. Он функционирует без проблем,
в нем нет дефектов, а еще он написан так,
чтобы следующему программисту было
легко с ни м работать.

Естественно, каждый хочет, чтобы его
код отличался высоким качеством. К
счастью, есть методы и инструменты,
позволяющие повысить качество кода.

Благодаря руководствам по стилю ваш
код может стать единообразным. PEP8 —
отличная отправная точка, если речь
идет о Python. Линтеры помогут вам обнаружить
проблемные места и стилевые несоответствия.
Использовать эти инструменты можно на
любой стадии процесса разработки; их
можно даже автоматизировать, чтобы код
с «пухом» не прошел слишком далеко.

Использование линтеров позволяет
избежать ненужных дискуссий о стиле в
ходе код-ревью. Некоторым людям морально
легче получить объективный фидбэк от
инструментов, а не от товарищей по
команде. Кроме того, некоторые ревьюеры
могут просто не хотеть «придираться»
к стилю проверяемого кода. Линтеры не
озабочены всеми этими политесами и
экономией времени: они жалуются на любое
несоответствие.

Кроме того, все линтеры, упомянутые в
этой статье, имеют различные опции для
ввода в командной строке и настройки,
позволяющие подогнать инструмент под
свои нужды. Важно понимать, что вы можете
быть настолько строги или снисходительны,
насколько захотите.

Улучшение качества кода это процесс.
Вы можете предпринимать некоторые шаги
в этом направлении и не выбрасывая весь
несоответствующий стандарту код.
Осведомленность — прекрасный первый
шаг. Чтобы его сделать, нужно только
осознать, насколько важно поддерживать
высокое качество кода.

Я начинающий Python, я читаю стандарты pep, которые должны следовать при программировании на python. Http://legacy.python.org/dev/peps/pep-0008

Теперь у меня есть сомнения. Поскольку они упомянули, что вы не должны помещать пробелы вокруг знака равенства при использовании аргумента ключевого слова или значения параметра по умолчанию в функциях или в Dict.

Например

ДА

def myfunc(key1=val1, key2=val2, key3=val3)

НЕТ

def myfunc(key1 = val1, key2 = val2, key3 = val3)

Thats штраф, но что, если я сломаю их в несколько строк. что-то вроде этого (когда у нас много параметров или длинное имя)

def myfunc(key1=val1, key2=val2, key3=val3)

В этом случае, я думаю, мы должны положить пространство вокруг знака равенства. я прав. потому что все это о читаемости, но мне просто любопытно, есть ли для этого стандарт. Ищите лучшие практики.

То же самое для Дикта.

new_dict= Dict(
       key1=val1, 
       key2=val2, 
       key3=val3
)

И я должен поместить запятую после последнего аргумента в dict в отличие от упомянутого выше примера, я не поместил запятую после последнего значения (key3 = val3)

17 июль 2014, в 20:41

Поделиться

Источник

3 ответа

PEP8 четко говорит:

Не используйте пробелы вокруг знака = при использовании для указания аргумента ключевого слова или значения параметра по умолчанию.

В обоих случаях вам не нужно помещать пробелы вокруг знака равенства.

Если вы не уверены, соответствует ли ваш код стандарту PEP8 или нет, используйте инструмент анализа статического кода flake8. Это приведет к предупреждению в случае нарушения стиля кода.

Пример:

У вас есть дополнительные пробелы вокруг равных знаков:

def myfunc(key1 = 'val1',
           key2 = 'val2',
           key3 = 'val3'):
    return key1, key2, key3

flake8 выводит предупреждение для каждого неожиданного пробела:

$ flake8 test.py
test.py:3:16: E251 unexpected spaces around keyword / parameter equals
test.py:3:18: E251 unexpected spaces around keyword / parameter equals
test.py:4:16: E251 unexpected spaces around keyword / parameter equals
test.py:4:18: E251 unexpected spaces around keyword / parameter equals
test.py:5:16: E251 unexpected spaces around keyword / parameter equals
test.py:5:18: E251 unexpected spaces around keyword / parameter equals

alecxe
17 июль 2014, в 16:21

Поделиться

Thats штраф, но что, если я сломаю их в несколько строк. что-то вроде этого (когда у нас много параметров или длинное имя)

def myfunc(key1=val1, 
       key2=val2, 
       key3=val3)

В коде, который вы указываете, вы не помещаете пробелы вокруг =, так что вы соблюдаете pep8 в отношении расстояния между операторами (ваш отступ не соответствует pep8).

В общем, вы можете написать свой код, как вам нравится. Если вы не согласны с pep8, другие люди обычно не смогут найти ваш код как легко читаемый. Если у вас есть локальные стандарты в вашей компании, это должно быть отменено pep8. Если у вас нет стандартов, которые заставляют вас нарушать pep8, ваши коллеги, скорее всего, ненавидят вас за нарушение pep8.

Если у вас нет стандарта вообще, в будущем вы также будете ненавидеть подарок.

Marcin
17 июль 2014, в 16:36

Поделиться

Нет. Не помещайте пробелы вокруг равных знаков при объявлении kwargs. Подумайте об этом так: если вы просто просматриваете строки кода, вы хотите тренировать свои глаза, чтобы увидеть разницу между оператором присваивания, используемым во время обычного потока программы (спам = True) и kwarg, особенно если он на собственной линии (спам = True).

Что касается конечной запятой, я всегда чувствовал, что конечная запятая предлагает коллеге или читателю, что я чувствую, что список, dict, множество аргументов и т.д. Могут быть подвержены расширению в будущем. Если я достаточно уверен, что структура представляет его зрелое состояние, я удаляю его.

jMyles
17 июль 2014, в 15:41

Поделиться

Ещё вопросы

  • 0нет разрешения на доступ к / на этом сервере. но я могу получить доступ к phpmyadmin
  • 1Понимание рекурсивного асинхронного вызова в JavaScript
  • 0функция выхода из jquery
  • 1Десериализация Yahoo! Fantasy API проигрыватель JSON
  • 1Копирование файла с устройства Android?
  • 0Сервер и клиент на Python и C
  • 1Прохождение комнат в текстовой игре на Java
  • 0Alt тег не отображается в браузере
  • 0не могу получить данные JSON из URL
  • 1Как изменить, чтобы панели с вкладками менялись каждые несколько секунд?
  • 0JSON декодировать PHP проблемы
  • 1Обновление строки morris.js ymin
  • 0Как я могу конвертировать мой BLOB-файл в WAV-файл?
  • 0Возврат указателя портит объект (нарушение прав доступа)
  • 0эта форма (codeigniter) не работает
  • 0тип ввода = щелчок файла не запускается через jquery
  • 1Нечетная ошибка компилятора, ошибка Davlik 1 от java.net.DatagramPacket.class
  • 0Как установить минимальную высоту синкфузионной сетки, используя Angular JS?
  • 1Android TabHost
  • 0Добавить класс с блесной, прежде чем двигаться дальше
  • 0Как сопоставить две разные колонны двух разных таблиц в SQL с помощью PHP?
  • 0JQuery FadeTo — как использовать
  • 0Mysql: округляет дату и время — некоторые проблемы 24 часа
  • 1Список Просмотр выбора, чтобы начать новую деятельность
  • 0Автозаполнение jQuery UI плагин с JSP и сервлетов не работает
  • 0Разница дат только с учетом года, месяца, дня
  • 0Задать значение скрытого поля ПОСЛЕ завершения загрузки файла с помощью blueimp Загрузка файла
  • 0JQuery добавить к ближайшему элементу, как я показываю
  • 0После символической ссылки: ОШИБКА 2002 (HY000): Не удается подключиться к локальному серверу MySQL через сокет ‘/tmp/mysql.sock’ (2)
  • 0выберите порядок по заголовкам товаров в группе
  • 0доступ к коллекции внутри json объекта углового
  • 0Uncaught TypeError: Свойство ‘setCurrency’ объекта [object Object] не является функцией
  • 0Извлечь изображение YouTube из строки
  • 1Имена папок Unicode для Android в Eclipse, приводящие к неправильной сборке
  • 0угловые данные начальной загрузки не отображаются должным образом
  • 1Android: получение информации о владельце телефона
  • 1ES8 — Почему есть методы padStart / padEnd?
  • 1Как кодировать объект, специфичный для вошедшего в систему пользователя
  • 0Codeigniter HREF с новой вкладкой
  • 1Использование модуля opencv stitcher для сшивания размытых изображений
  • 1Не удается выполнить операцию с результатом из веб-обозрения Android?
  • 1Android Dev: проблема с мобильным подключением к Интернету после пробуждения телефона
  • 1Как я могу проверить, равен ли ввод букв в массиве?
  • 1Android симулятор видео
  • 1Добавление Jpanel, содержащего JButton, нарушает структуру кадра
  • 0Как динамически добавлять шаблоны на страницу в Angular
  • 0Как отобразить первое значение раскрывающегося списка из одной таблицы и другие значения этого же раскрывающегося списка из другой таблицы
  • 1Как изменить параметр внутри объекта?
  • 0как выбрать имя столбца вместе с примененной к нему агрегатной функцией
  • 0Получить конкретный текст с веб-сайта (HTML)

Сообщество Overcoder

Hello community,

it seems like I finally hit a problem with automated code review. This one seems to be rather tricky. I have several pieces of code that work like this:

class SomeClass:
    def check_something(...):
        return self.filter(
            some_var=SomeOtherClass.SOME_STATIC_ATTRIBUTE
        )

now unfortunately, some_var is getting longer and longer, so it now looks like:

class SomeOtherClass:
    def check_something(...):
        return self.filter(
            Q(
                some_long_table_name__joined_with_another_table_with_long_name__some_variable_with_long_name=SomeOtherClass.SOME_STATIC_ATTRIBUTE
            ) | Q(
                ...
            )
        )

(In case you’re wondering, you are looking at a Django QuerySet that joins over multiple tables)

Now this line is obviously too long, so pep8 is complaining (we already use 120 chars line length). So now let’s just insert a break, right?

class SomeOtherClass:
    def check_something(...):
        return self.filter(
            Q(
                some_long_table_name__joined_with_another_table_with_long_name__some_variable_with_long_name=
                SomeOtherClass.SOME_STATIC_ATTRIBUTE
            ) | Q(
                ...
            )
        )

nope! Pep8/Pycodestyle complains with «E251 unexpected spaces around keyword / parameter equals».

I do understand what E251 is trying to do, it prevents you from writing code like «def my_function(a = 1, b= 1)», but it seems like I’ve hit the case where I can not make my code compliable with pep8 without sacrifising readability? I mean the obvious fix would be to create a dictionary which I pass into the Q() function, but like I said, I believe that readability of my code would suffer.

Any thoughts on this?

E1 Indentation E101 indentation contains mixed spaces and tabs E111 indentation is not a multiple of four E112 expected an indented block E113 unexpected indentation E114 indentation is not a multiple of four (comment) E115 expected an indented block (comment) E116 unexpected indentation (comment)     E121 (*^) continuation line under-indented for hanging indent E122 (^) continuation line missing indentation or outdented E123 (*) closing bracket does not match indentation of opening bracket’s line E124 (^) closing bracket does not match visual indentation E125 (^) continuation line with same indent as next logical line E126 (*^) continuation line over-indented for hanging indent E127 (^) continuation line over-indented for visual indent E128 (^) continuation line under-indented for visual indent E129 (^) visually indented line with same indent as next logical line E131 (^) continuation line unaligned for hanging indent E133 (*) closing bracket is missing indentation     E2 Whitespace E201 whitespace after ‘(‘ E202 whitespace before ‘)’ E203 whitespace before ‘:’     E211 whitespace before ‘(‘     E221 multiple spaces before operator E222 multiple spaces after operator E223 tab before operator E224 tab after operator E225 missing whitespace around operator E226 (*) missing whitespace around arithmetic operator E227 missing whitespace around bitwise or shift operator E228 missing whitespace around modulo operator     E231 missing whitespace after ‘,’, ‘;’, or ‘:’     E241 (*) multiple spaces after ‘,’ E242 (*) tab after ‘,’     E251 unexpected spaces around keyword / parameter equals     E261 at least two spaces before inline comment E262 inline comment should start with ‘# ‘ E265 block comment should start with ‘# ‘ E266 too many leading ‘#’ for block comment     E271 multiple spaces after keyword E272 multiple spaces before keyword E273 tab after keyword E274 tab before keyword E275 missing whitespace after keyword     E3 Blank line E301 expected 1 blank line, found 0 E302 expected 2 blank lines, found 0 E303 too many blank lines (3) E304 blank lines found after function decorator E305 expected 2 blank lines after end of function or class E306 expected 1 blank line before a nested definition     E4 Import E401 multiple imports on one line E402 module level import not at top of file     E5 Line length E501 (^) line too long (82 > 79 characters) E502 the backslash is redundant between brackets     E7 Statement E701 multiple statements on one line (colon) E702 multiple statements on one line (semicolon) E703 statement ends with a semicolon E704 (*) multiple statements on one line (def) E711 (^) comparison to None should be ‘if cond is None:’ E712 (^) comparison to True should be ‘if cond is True:’ or ‘if cond:’ E713 test for membership should be ‘not in’ E714 test for object identity should be ‘is not’ E721 (^) do not compare types, use ‘isinstance()’ E722 do not use bare except, specify exception instead E731 do not assign a lambda expression, use a def E741 do not use variables named ‘l’, ‘O’, or ‘I’ E742 do not define classes named ‘l’, ‘O’, or ‘I’ E743 do not define functions named ‘l’, ‘O’, or ‘I’     E9 Runtime E901 SyntaxError or IndentationError E902 IOError     W1 Indentation warning W191 indentation contains tabs     W2 Whitespace warning W291 trailing whitespace W292 no newline at end of file W293 blank line contains whitespace     W3 Blank line warning W391 blank line at end of file     W5 Line break warning W503 (*) line break before binary operator W504 (*) line break after binary operator W505 (*^) doc line too long (82 > 79 characters)     W6 Deprecation warning W601 .has_key() is deprecated, use ‘in’ W602 deprecated form of raising exception W603 ‘<>’ is deprecated, use ‘!=’ W604 backticks are deprecated, use ‘repr()’ W605 invalid escape sequence ‘x’ W606 ‘async’ and ‘await’ are reserved keywords starting with Python 3.7

Понравилась статья? Поделить с друзьями:

Читайте также:

  • E231 missing whitespace after как исправить
  • E225 ошибка принтера
  • E225 0001 canon ошибка
  • E22 ошибка стиральная машина bosch
  • E22 ошибка посудомоечная машина бош

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии