Синтаксическая ошибка проверьте отступы

I have a Python script: if True: if False: print('foo') print('bar') However, when I attempt to run my script, Python raises an IndentationError: File "script.py", line ...

Why does indentation matter?

In Python, indentation is used to delimit blocks of code. This is different from many other languages that use curly braces {} to delimit blocks such as Java, Javascript, and C. Because of this, Python users must pay close attention to when and how they indent their code because whitespace matters.

When Python encounters a problem with the indentation of your program, it either raises an exception called IndentationError or TabError.

A little history

The historical reasons for why Python uses indentation vs the arguably more commonly accepted curly braces {} is outlined in an article of the history of Python by Guido van Rossum — the creator of Python:

Python’s use of indentation comes directly from ABC, but this idea didn’t originate with ABC—it had already been promoted by Donald Knuth and was a well-known concept of programming style. (The occam programming language also used it.) However, ABC’s authors did invent the use of the colon that separates the lead-in clause from the indented block. After early user testing without the colon, it was discovered that the meaning of the indentation was unclear to beginners being taught the first steps of programming. The addition of the colon clarified it significantly: the colon somehow draws attention to what follows and ties the phrases before and after it together in just the right way.

How do I indent my code?

The basic rule for indenting Python code (considering that you treat the entire program as a «basic block») is: The first statement in a basic block, and each subsequent statement after it must be indented by the same amount.

So technically the following Python program is correct:

def perm(l):
        # Compute the list of all permutations of l
    if len(l) <= 1:
                  return [l]
    r = []
    for i in range(len(l)):
             s = l[:i] + l[i+1:]
             p = perm(s)
             for x in p:
              r.append(l[i:i+1] + x)
    return r

However, as you can probably tell from above, randomly indenting your code makes is extremely hard to read and follow the flow of the program. It’s better to be consistent and follow a style.

PEP 8 — the Python style guide — says:

Use 4 spaces per indentation level.

That is, each statement that is starting a new block and each subsequent statement in the new block, should be indented four spaces from the current indentation level. Here is the above program indented according to the PEP8 style guide:

def perm(l):
    # Compute the list of all permutations of l
    if len(l) <= 1:
        return [l]
    r = []
    for i in range(len(l)):
        s = l[:i] + l[i+1:]
        p = perm(s)
        for x in p:
            r.append(l[i:i+1] + x)
    return r

Can I still use tabs?

Python realizes that some people still prefer tabs over spaces and that legacy code may use tabs rather than spaces, so it allows the use of tabs as indentation. PEP8 touches on this topic:

Spaces are the preferred indentation method.

Tabs should be used solely to remain consistent with code that is already indented with tabs.

Note however the one big caveat is not to use both tabs and spaces for indentation. Doing so can cause all kinds of strange hard to debug indentation errors. Python expands tabs to the next 8th column, but if your editor is set to a tab size of 4 columns, or you you use spaces as well as tabs, you can easily produce indented code that looks fine in your editor, but Python will refuse to run. The Python 3 compiler explicitly rejects any program containing an ambiguous mixture of tabs and spaces, usually by raising a TabError. However, by default, mixing tabs and spaces is still allowed in Python 2, but it is highly recommended not to use this «feature». Use the -t and -tt command line flags to force Python 2 to raise a warning or (preferably) an error respectively. PEP8 also discusses this topic:

Python 3 disallows mixing the use of tabs and spaces for indentation.

Python 2 code indented with a mixture of tabs and spaces should be converted to using spaces exclusively.

When invoking the Python 2 command line interpreter with the -t option, it issues warnings about code that illegally mixes tabs and spaces. When using -tt these warnings become errors. These options are highly recommended!

What does «IndentationError: unexpected indent» mean?

Problem

This error occurs when a statement is unnecessarily indented or its indentation does not match the indentation of former statements in the same block. For example, the first statement in the program below is unnecessarily indented:

>>>  print('Hello') # this is indented 
  File "<stdin>", line 1
    print('Hello') # this is indented 
    ^
IndentationError: unexpected indent

In this example, the can_drive = True line in the if block does not match the indentation of any former statement:

>>> age = 10
>>> can_drive = None
>>> 
>>> if age >= 18:
...     print('You can drive')
...      can_drive = True # incorrectly indented
  File "<stdin>", line 3
    can_drive = True # incorrectly indented
    ^
IndentationError: unexpected indent

Fix

The fix for this error is to first make sure the problematic line even needs to be indented. For example, the above example using print can be fixed simply be unindenting the line:

>>> print('Hello') # simply unindent the line
Hello

However, if you are sure the line does need to be indented, the indentation needs to match that of a former statement in the same block. In the second example above using if, we can fix the error by making sure the line with can_drive = True is indented at the same level as the former statements in the if body:

>>> age = 10
>>> can_drive = None
>>> 
>>> if age >= 18:
...     print('You can drive')
...     can_drive = True # indent this line at the same level.
... 

What does «IndentationError: expected an indented block» mean?

(This might also occur as SyntaxError: unexpected EOF while parsing in Python 3.8 or lower.)

Problem

This error occurs when Python sees the ‘header’ for a compound statement, such as if <condition>: or while <condition>: but the compound statement’s body or block is never defined. For example in the code below we began an if statement, but we never define a body for the statement:

>>> if True:
... 
  File "<stdin>", line 2
    
    ^
IndentationError: expected an indented block

In this second example, we began writing a for loop, but we forget to indent the for loop body. So Python still expects an indented block for the for loop body:

>>> names = ['sarah', 'lucy', 'michael']
>>> for name in names:
... print(name)
  File "<stdin>", line 2
    print(name)
        ^
IndentationError: expected an indented block

Comments don’t count as bodies:

>>> if True:
...     # TODO
...
  File "<stdin>", line 3

    ^
IndentationError: expected an indented block

Fix

The fix for this error is to simply include a body for the compound statement.

As shown above, a common mistake by new users is that they forget to indent the body. If this is the case, make sure each statement meant to be included in the compound statement’s body is indented at the same level under the compound statement’s beginning. Here is the above example fixed:

>>> names = ['sarah', 'lucy', 'michael']
>>> for name in names:
...     print(name) # The for loop body is now correctly indented.
... 
sarah
lucy
michael

Another common case is that, for some reason, a user may not want to define an actual body for the compound statement, or the body may be commented out. In this case, the pass statement can be used. The pass statement can be used anywhere Python expects one or more statements as a placeholder. From the documentation for pass:

pass is a null operation — when it is executed, nothing happens. It is useful as a placeholder when a statement is required syntactically, but no code needs to be executed, for example:

def f(arg): pass    # a function that does nothing (yet)

class C: pass       # a class with no methods (yet)

Here is the above example with the if statement fixed by using the pass keyword:

>>> if True:
...     pass # We don't want to define a body.
... 
>>> 

What does «IndentationError: unindent does not match any outer indentation level» mean?

Problem

This error occurs when you unindent a statement, but now the indentation level of that statement does not match that of any former statement. For example, in the below code we unindent the second call to print. However, the indentation level does not match that of any former statement:

>>> if True:
...     if True:
...         print('yes')
...    print()
  File "<stdin>", line 4
    print()
          ^
IndentationError: unindent does not match any outer indentation level

This error is especially hard to catch because even one space will cause your code to fail.

Fix

The fix is to ensure that when you unindent a statement, the indentation level matches that of a former statement. Consider the above example once again. In the example, I want the second call to print to be in the first if statements body. So I need to make sure that that line’s indentation level matches that of the former statements in the first if statement’s body:

>>> if True:
...     if True:
...         print('yes')
...     print() # indentation level now matches former statement's level.
... 
yes

>>> 

I’m still getting an IndentationError but my program appears to be correctly indented. What do I do?

If your program visually appears to have correct indentation, but your still getting an IndentationError you have most likely mixed tabs with spaces. This will sometimes cause Python to raises strange errors. See the subsection Special cases under What does «TabError: inconsistent use of tabs and spaces in indentation» mean? for an more in-depth explanation of the problem.

What does «TabError: inconsistent use of tabs and spaces in indentation» mean?

Problem

This error only occurs when you attempt to mix tabs and spaces as indentation characters. As said above, Python will not allow your program to contain a mix of tabs and spaces, and will raise the specific exception TabError if it finds you have. For example, in the program below, a mix of tabs and spaces is used for indentation:

>>> if True:
...     if True:
...         print()
...     print()
...     print()
  File "<stdin>", line 5
    print()
          ^
TabError: inconsistent use of tabs and spaces in indentation

Here is a picture which visually shows the whitespace in the above program. Gray dots are spaces, and gray arrows are tabs:

enter image description here

We can see we have indeed mixed spaces and tabs for indentation.

Special cases

Note Python will not always raise a TabError if you mix tabs and spaces into your program. If the program indentation is unambiguous, Python will allow tabs and spaces to be mixed. For example:

>>> if True:
...     if True: # tab
...         pass # tab, then 4 spaces
... 
>>> 

And sometimes Python simply chokes on the mixture of tabs and spaces and erroneously raises an IndentationError exception when a TabError would be more appropriate. Another example:

>>> if True:
...     pass # tab
...     pass # 4 spaces
  File "<stdin>", line 3
    pass # 4 spaces
                ^
IndentationError: unindent does not match any outer indentation level

As you can see, running your code this way can create mysterious errors. Even though the program visually appears to be fine, Python became confused trying to parse the tabs and spaces used for indention and errored out.

These are excellent examples that demonstrate why to never mix tabs and spaces and make use of the -t and -tt interpreter flags when using Python 2.

Fix

If your program is short, probably the easiest and quickest fix is to simply re-indent the program. Make sure each statement is indented by four spaces per indention level (see How do I indent my code?).

However, if you already have a large program that you’ve mixed tabs and spaces into, there are automated tools that can be used to convert all of your indentation to just spaces.

Many editors such as PyCharm and SublimeText have options to automatically convert tabs to spaces. There are also several on-line tools such as Tabs To Spaces or Browserling that allow you to quickly re-indent your code. There are also tools written in Python. autopep8 for example can automatically re-indent your code and fix other indentation errors as well.

Even the best tools though will sometimes not be able to fix all of your indentation errors and you’ll have to fix them manually. That’s why it’s important to always properly indent your code from the start.

A note about «SyntaxError» related indentation problems

Although not often, sometimes certain SyntaxError exceptions are raised due to incorrect indentation. For example, look at the code below:

if True:
    pass
pass # oops! this statement should be indented!.
else:
    pass

When the above code is run, a SyntaxError is raised:

Traceback (most recent call last):
  File "python", line 4
    else:
       ^
SyntaxError: invalid syntax

Although Python raises a SyntaxError, the real problem with the above code is that the second pass statement should be indented. Because the second pass isn’t indented, Python doesn’t realize that the previous if statement and the else statement are meant to be connected.

The fix for this type of error is to simply correctly re-indent your code. To see how to properly indent your code, see the section How do I indent my code?.

I’m still having a hard time with Python’s indentation syntax. What do I do?

Don’t get discouraged if you’re still struggling. It can take time to get use to
Python’s whitespace syntax rules. Here are some tips to help:

  • Get an editor that will tell you when you have an indentation error. Some goods ones are as said above are, PyCharm, SublimeText, and Jupyter Notebook.
  • When you indent your code, count out loud to yourself how many times you press the space-bar (or tab key). For example, if you needed to indent a line by four spaces, you would say out loud «one, two, three, four» while simultaneously pressing the space-bar each time. It sounds silly, but it helps train your brain to think about how deep you’re indenting your code.
  • If you have an editor, see if it has an option to automatically convert tabs to spaces.
  • View others’ code. Browse github or Stackoverflow and see examples of Python code.
  • Just write code. That’s the single best way to get better. The more you write Python code, the better you’ll get.

Resources used

  • https://en.wikipedia.org/
  • https://docs.python.org/3/
  • http://python-history.blogspot.com/2009/02/early-language-design-and-development.html
  • https://www.python.org/dev/peps/pep-0008/

Why does indentation matter?

In Python, indentation is used to delimit blocks of code. This is different from many other languages that use curly braces {} to delimit blocks such as Java, Javascript, and C. Because of this, Python users must pay close attention to when and how they indent their code because whitespace matters.

When Python encounters a problem with the indentation of your program, it either raises an exception called IndentationError or TabError.

A little history

The historical reasons for why Python uses indentation vs the arguably more commonly accepted curly braces {} is outlined in an article of the history of Python by Guido van Rossum — the creator of Python:

Python’s use of indentation comes directly from ABC, but this idea didn’t originate with ABC—it had already been promoted by Donald Knuth and was a well-known concept of programming style. (The occam programming language also used it.) However, ABC’s authors did invent the use of the colon that separates the lead-in clause from the indented block. After early user testing without the colon, it was discovered that the meaning of the indentation was unclear to beginners being taught the first steps of programming. The addition of the colon clarified it significantly: the colon somehow draws attention to what follows and ties the phrases before and after it together in just the right way.

How do I indent my code?

The basic rule for indenting Python code (considering that you treat the entire program as a «basic block») is: The first statement in a basic block, and each subsequent statement after it must be indented by the same amount.

So technically the following Python program is correct:

def perm(l):
        # Compute the list of all permutations of l
    if len(l) <= 1:
                  return [l]
    r = []
    for i in range(len(l)):
             s = l[:i] + l[i+1:]
             p = perm(s)
             for x in p:
              r.append(l[i:i+1] + x)
    return r

However, as you can probably tell from above, randomly indenting your code makes is extremely hard to read and follow the flow of the program. It’s better to be consistent and follow a style.

PEP 8 — the Python style guide — says:

Use 4 spaces per indentation level.

That is, each statement that is starting a new block and each subsequent statement in the new block, should be indented four spaces from the current indentation level. Here is the above program indented according to the PEP8 style guide:

def perm(l):
    # Compute the list of all permutations of l
    if len(l) <= 1:
        return [l]
    r = []
    for i in range(len(l)):
        s = l[:i] + l[i+1:]
        p = perm(s)
        for x in p:
            r.append(l[i:i+1] + x)
    return r

Can I still use tabs?

Python realizes that some people still prefer tabs over spaces and that legacy code may use tabs rather than spaces, so it allows the use of tabs as indentation. PEP8 touches on this topic:

Spaces are the preferred indentation method.

Tabs should be used solely to remain consistent with code that is already indented with tabs.

Note however the one big caveat is not to use both tabs and spaces for indentation. Doing so can cause all kinds of strange hard to debug indentation errors. Python expands tabs to the next 8th column, but if your editor is set to a tab size of 4 columns, or you you use spaces as well as tabs, you can easily produce indented code that looks fine in your editor, but Python will refuse to run. The Python 3 compiler explicitly rejects any program containing an ambiguous mixture of tabs and spaces, usually by raising a TabError. However, by default, mixing tabs and spaces is still allowed in Python 2, but it is highly recommended not to use this «feature». Use the -t and -tt command line flags to force Python 2 to raise a warning or (preferably) an error respectively. PEP8 also discusses this topic:

Python 3 disallows mixing the use of tabs and spaces for indentation.

Python 2 code indented with a mixture of tabs and spaces should be converted to using spaces exclusively.

When invoking the Python 2 command line interpreter with the -t option, it issues warnings about code that illegally mixes tabs and spaces. When using -tt these warnings become errors. These options are highly recommended!

What does «IndentationError: unexpected indent» mean?

Problem

This error occurs when a statement is unnecessarily indented or its indentation does not match the indentation of former statements in the same block. For example, the first statement in the program below is unnecessarily indented:

>>>  print('Hello') # this is indented 
  File "<stdin>", line 1
    print('Hello') # this is indented 
    ^
IndentationError: unexpected indent

In this example, the can_drive = True line in the if block does not match the indentation of any former statement:

>>> age = 10
>>> can_drive = None
>>> 
>>> if age >= 18:
...     print('You can drive')
...      can_drive = True # incorrectly indented
  File "<stdin>", line 3
    can_drive = True # incorrectly indented
    ^
IndentationError: unexpected indent

Fix

The fix for this error is to first make sure the problematic line even needs to be indented. For example, the above example using print can be fixed simply be unindenting the line:

>>> print('Hello') # simply unindent the line
Hello

However, if you are sure the line does need to be indented, the indentation needs to match that of a former statement in the same block. In the second example above using if, we can fix the error by making sure the line with can_drive = True is indented at the same level as the former statements in the if body:

>>> age = 10
>>> can_drive = None
>>> 
>>> if age >= 18:
...     print('You can drive')
...     can_drive = True # indent this line at the same level.
... 

What does «IndentationError: expected an indented block» mean?

(This might also occur as SyntaxError: unexpected EOF while parsing in Python 3.8 or lower.)

Problem

This error occurs when Python sees the ‘header’ for a compound statement, such as if <condition>: or while <condition>: but the compound statement’s body or block is never defined. For example in the code below we began an if statement, but we never define a body for the statement:

>>> if True:
... 
  File "<stdin>", line 2
    
    ^
IndentationError: expected an indented block

In this second example, we began writing a for loop, but we forget to indent the for loop body. So Python still expects an indented block for the for loop body:

>>> names = ['sarah', 'lucy', 'michael']
>>> for name in names:
... print(name)
  File "<stdin>", line 2
    print(name)
        ^
IndentationError: expected an indented block

Comments don’t count as bodies:

>>> if True:
...     # TODO
...
  File "<stdin>", line 3

    ^
IndentationError: expected an indented block

Fix

The fix for this error is to simply include a body for the compound statement.

As shown above, a common mistake by new users is that they forget to indent the body. If this is the case, make sure each statement meant to be included in the compound statement’s body is indented at the same level under the compound statement’s beginning. Here is the above example fixed:

>>> names = ['sarah', 'lucy', 'michael']
>>> for name in names:
...     print(name) # The for loop body is now correctly indented.
... 
sarah
lucy
michael

Another common case is that, for some reason, a user may not want to define an actual body for the compound statement, or the body may be commented out. In this case, the pass statement can be used. The pass statement can be used anywhere Python expects one or more statements as a placeholder. From the documentation for pass:

pass is a null operation — when it is executed, nothing happens. It is useful as a placeholder when a statement is required syntactically, but no code needs to be executed, for example:

def f(arg): pass    # a function that does nothing (yet)

class C: pass       # a class with no methods (yet)

Here is the above example with the if statement fixed by using the pass keyword:

>>> if True:
...     pass # We don't want to define a body.
... 
>>> 

What does «IndentationError: unindent does not match any outer indentation level» mean?

Problem

This error occurs when you unindent a statement, but now the indentation level of that statement does not match that of any former statement. For example, in the below code we unindent the second call to print. However, the indentation level does not match that of any former statement:

>>> if True:
...     if True:
...         print('yes')
...    print()
  File "<stdin>", line 4
    print()
          ^
IndentationError: unindent does not match any outer indentation level

This error is especially hard to catch because even one space will cause your code to fail.

Fix

The fix is to ensure that when you unindent a statement, the indentation level matches that of a former statement. Consider the above example once again. In the example, I want the second call to print to be in the first if statements body. So I need to make sure that that line’s indentation level matches that of the former statements in the first if statement’s body:

>>> if True:
...     if True:
...         print('yes')
...     print() # indentation level now matches former statement's level.
... 
yes

>>> 

I’m still getting an IndentationError but my program appears to be correctly indented. What do I do?

If your program visually appears to have correct indentation, but your still getting an IndentationError you have most likely mixed tabs with spaces. This will sometimes cause Python to raises strange errors. See the subsection Special cases under What does «TabError: inconsistent use of tabs and spaces in indentation» mean? for an more in-depth explanation of the problem.

What does «TabError: inconsistent use of tabs and spaces in indentation» mean?

Problem

This error only occurs when you attempt to mix tabs and spaces as indentation characters. As said above, Python will not allow your program to contain a mix of tabs and spaces, and will raise the specific exception TabError if it finds you have. For example, in the program below, a mix of tabs and spaces is used for indentation:

>>> if True:
...     if True:
...         print()
...     print()
...     print()
  File "<stdin>", line 5
    print()
          ^
TabError: inconsistent use of tabs and spaces in indentation

Here is a picture which visually shows the whitespace in the above program. Gray dots are spaces, and gray arrows are tabs:

enter image description here

We can see we have indeed mixed spaces and tabs for indentation.

Special cases

Note Python will not always raise a TabError if you mix tabs and spaces into your program. If the program indentation is unambiguous, Python will allow tabs and spaces to be mixed. For example:

>>> if True:
...     if True: # tab
...         pass # tab, then 4 spaces
... 
>>> 

And sometimes Python simply chokes on the mixture of tabs and spaces and erroneously raises an IndentationError exception when a TabError would be more appropriate. Another example:

>>> if True:
...     pass # tab
...     pass # 4 spaces
  File "<stdin>", line 3
    pass # 4 spaces
                ^
IndentationError: unindent does not match any outer indentation level

As you can see, running your code this way can create mysterious errors. Even though the program visually appears to be fine, Python became confused trying to parse the tabs and spaces used for indention and errored out.

These are excellent examples that demonstrate why to never mix tabs and spaces and make use of the -t and -tt interpreter flags when using Python 2.

Fix

If your program is short, probably the easiest and quickest fix is to simply re-indent the program. Make sure each statement is indented by four spaces per indention level (see How do I indent my code?).

However, if you already have a large program that you’ve mixed tabs and spaces into, there are automated tools that can be used to convert all of your indentation to just spaces.

Many editors such as PyCharm and SublimeText have options to automatically convert tabs to spaces. There are also several on-line tools such as Tabs To Spaces or Browserling that allow you to quickly re-indent your code. There are also tools written in Python. autopep8 for example can automatically re-indent your code and fix other indentation errors as well.

Even the best tools though will sometimes not be able to fix all of your indentation errors and you’ll have to fix them manually. That’s why it’s important to always properly indent your code from the start.

A note about «SyntaxError» related indentation problems

Although not often, sometimes certain SyntaxError exceptions are raised due to incorrect indentation. For example, look at the code below:

if True:
    pass
pass # oops! this statement should be indented!.
else:
    pass

When the above code is run, a SyntaxError is raised:

Traceback (most recent call last):
  File "python", line 4
    else:
       ^
SyntaxError: invalid syntax

Although Python raises a SyntaxError, the real problem with the above code is that the second pass statement should be indented. Because the second pass isn’t indented, Python doesn’t realize that the previous if statement and the else statement are meant to be connected.

The fix for this type of error is to simply correctly re-indent your code. To see how to properly indent your code, see the section How do I indent my code?.

I’m still having a hard time with Python’s indentation syntax. What do I do?

Don’t get discouraged if you’re still struggling. It can take time to get use to
Python’s whitespace syntax rules. Here are some tips to help:

  • Get an editor that will tell you when you have an indentation error. Some goods ones are as said above are, PyCharm, SublimeText, and Jupyter Notebook.
  • When you indent your code, count out loud to yourself how many times you press the space-bar (or tab key). For example, if you needed to indent a line by four spaces, you would say out loud «one, two, three, four» while simultaneously pressing the space-bar each time. It sounds silly, but it helps train your brain to think about how deep you’re indenting your code.
  • If you have an editor, see if it has an option to automatically convert tabs to spaces.
  • View others’ code. Browse github or Stackoverflow and see examples of Python code.
  • Just write code. That’s the single best way to get better. The more you write Python code, the better you’ll get.

Resources used

  • https://en.wikipedia.org/
  • https://docs.python.org/3/
  • http://python-history.blogspot.com/2009/02/early-language-design-and-development.html
  • https://www.python.org/dev/peps/pep-0008/

На чтение 3 мин. Просмотров 389 Опубликовано 18.04.2021

Python – это развивающийся язык программирования, который был впервые выпущен в 1991 году. Этот язык известен своей большой всеобъемлющей библиотекой и поддерживает несколько парадигм программирования, таких как функциональное, императивное, процедурное и объектно-ориентированное.

Ошибка отступа: ожидается блок с отступом ‘ встречается у всех типов пользователей ; будь то новички или опытные. Поскольку Python упорядочивает весь свой код с помощью правильных пробелов, если у вас плохой отступ, код не будет компилироваться, и вам будет возвращено сообщение об ошибке.

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

Содержание

  1. Что вызывает ошибку отступов в Python?
  2. Решение 1. Проверка неправильных пробелов/табуляций
  3. Решение 2: Включение символов табуляции/пробела в редакторе

Что вызывает ошибку отступов в Python?

Like Как упоминалось ранее, эта ошибка в основном возникает из-за того, что в вашем коде есть пробелы или табуляции. Поскольку Python использует процедурный язык, вы можете столкнуться с этой ошибкой, если вы неправильно разместили табуляции/пробелы. Программа может работать правильно, но если интерпретатор обнаружит эту ошибку, сообщение об ошибке появится посередине. Некоторые из причин ошибки:

  • В вашем коде используются как пробелы, так и табуляции . Если оба используются взаимозаменяемо, интерпретатор не сможет определить, какой элемент использовать.
  • Вы разместили отступ неправильно . Если практика отступов не соблюдается, эта ошибка неизбежно возникнет.
  • Вы забыли сделать отступ для составных операторов , таких как ‘if’, ‘for’, ‘while’ и т. д.
  • Вы забыли сделать отступ для пользовательских функций или классов .

Решение 1. Проверка неправильных пробелов/табуляций

Для этой проблемы нет мгновенного решения. Поскольку код ваш, вы должны просмотреть каждую строку и посмотреть, где вы допустили ошибку. В коде есть несколько блоков по структуре. Если есть оператор ‘If’, в коде, который следует за ним, должен быть отступ.

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

Правильный отступ показан в приведенном выше примере. См. Цикл «for» для начала. Все внутри цикла for должно иметь отступ. Внутри цикла for у нас есть оператор if. Внутри оператора «if» все должно иметь больше отступов..

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

Решение 2: Включение символов табуляции/пробела в редакторе

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

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

  1. Нажмите Вид> Показать символ> Показать пробелы и TAB
  1. Теперь опция включена. Вы также можете включить Руководство по отступам , чтобы вам было проще.

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

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

Мы рассмотрим следующие ошибки:

  • Неправильные отступы
  • ImportError
  • Изменяемые аргументы, установленные по умолчанию
  • Забытое двоеточие
  • Несоответствие скобок
  • Неправильное применение функции инициализации
  • Изменение значений переменных класса без использования имени класса
  • Непонимание правил области видимости в Python
  • Непонимание того, как Python связывает переменные в замыканиях
  • Исчерпание итераторов

Неправильные отступы

В Python отступ указывает, относится ли данная строка к предыдущему оператору в блоке кода. Официальные правила стиля Python (PEP 8) рекомендуют использовать отступ в четыре пробела. Однако вы можете выбирать любое количество пробелов, а также пользоваться табами. Какой бы отступ вы ни предпочли, Python требует одного – согласованности.

Чтобы исправить ошибку отступа, попробуйте сделать следующее:

  • Используйте пробелы или табы, но не комбинируйте их. Будьте особенно внимательны, так как вы можете не осознавать, что использовали и табы, и пробелы, если полученный отступ выглядит одинаково. Преобразование табов в пробелы (или наоборот) скорее всего можно настроить в вашем редакторе кода или IDE.
  • Следите за количеством пробелов, которые вы используете. Следовать рекомендации PEP 8 о четырех пробелах не обязательно, но какое бы число вы ни выбрали, придерживайтесь его! К примеру, если вы делаете отступы по 2 пробела, то везде должно быть 2 пробела.

ImportError

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

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

Решение? Просто переименуйте файл в своей библиотеке и дайте ему уникальное имя, которое не используется в модулях стандартной библиотеки.

[python_ad_block]

Использование изменяемых типов для аргументов, устанавливаемых по умолчанию

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

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

def some_func(default_arg=[]):
    default_arg.append("some_string")
    return default_arg

print(some_func())
print(some_func())
print(some_func([]))
print(some_func())

=>['some_string']
=>['some_string', 'some_string']
=>['some_string']
=>['some_string', 'some_string', 'some_string']

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

def some_func(default_arg=None):
    if default_arg is None:
        default_arg = []
    default_arg.append("some_string")
    return default_arg

print(some_func())
print(some_func())
print(some_func([]))
print(some_func())
=>['some_string']
=>['some_string']
=>['some_string']
=>['some_string']

Забытое двоеточие

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

Несоответствие скобок

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

Неправильное применение функции инициализации

Используемая как конструктор, функция __init__ создает объект или выделяет память для нового объекта класса. Функция __init__ используется в качестве конструктора, когда объект создается из класса, и позволяет классу инициализировать атрибуты класса. Другими словами, она используется исключительно для установки значений. Однако распространенной ошибкой разработчиков Python является попытка использовать этот метод для возврата значений. Чтобы исправить это, просто запомните, что функция __init__ в Python предназначена исключительно для использования в качестве конструктора класса.

Изменение значений переменных класса без использования имени класса

Поскольку Python — объектно-ориентированный язык, переменные класса и экземпляра работают по-разному.

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

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

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

Уникальный анализ области действия Python основан на правиле LEGB (Local, Enclosing, Global, Built-in). Следуя порядку LEGB, Python сначала предположит, что любая переменная, объявленная в диапазоне, является локальной для этой области, и переопределит любую переменную с тем же именем во внешней области. Это означает, что код, который выполнялся должным образом при объявлении переменной, может позже вернуть UnboundLocalError при повторном вызове функции.

В следующем примере мы рассмотрим код, который изначально работает должным образом:

x = 10
def bar():
    print(x)
bar()
=>10

Однако этот код возвращает UnboundLocalError, как только мы попробуем изменить значение переменной х. Согласно порядку LEGB, Python распознает эту операцию для x как для локальной переменной, а не как переменную внешней области видимости.

x = 10
def foo():
    print(x)
    x += 1
foo()
=>Traceback (most recent call last):
=>  File "main.py", line 5, in <module>
=>    foo()
=>  File "main.py", line 3, in foo
=>    print(x)
=>UnboundLocalError: local variable 'x' referenced before assignment

Чтобы исправить UnboundLocalError, просто нужно добавить оператор присваивания, чтобы явно объявить, что переменная является глобальной.

x = 10
def foobar():
    global x
    print(x)
    x += 1
foobar()
=>10

Непонимание того, как Python связывает переменные в замыканиях

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

Исчерпанные итераторы

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

Данный тип ошибки может выглядеть следующим образом. В Python 2 вы можете вызвать функцию-итератор, такую ​​как zip(), для объединения двух списков и попытаться затем распечатать этот список. Если вы используете тот же самый код в Python 3, он не вернет вам все значения сразу. Это потому, что вы исчерпали итератор, и у него нет оставшихся значений для возврата.

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

Заключение

Сегодня мы рассмотрели 10 распространенных ошибок программистов Python и пути их устранения. Надеемся статья была вам полезна. Успехов в написании кода!

Перевод статьи «10 common mistakes Python programmers make (and how to fix them)».

Содержание

  • 1 Что вызывает ошибку отступа в Python?
    • 1.1 Решение 1. Проверка на наличие неправильных пробелов / вкладок
    • 1.2 Решение 2. Включение символов табуляции / пробела в редакторе

Python — это новый язык программирования, впервые выпущенный в 1991 году. Язык известен своей обширной обширной библиотекой и поддерживает несколько парадигм программирования, таких как функциональная, императивная, процедурная и объектно-ориентированная.

Ошибка отступа Python при кодированииОшибка отступа в Python

Ошибка отступа: ожидается блок с отступом’Происходит для всех видов пользователей; будь они новички или опытные. Поскольку Python упорядочивает весь свой код по правильным пробелам, если у вас неправильный отступ, код не скомпилируется, и вам будет возвращено сообщение об ошибке.

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

Что вызывает ошибку отступа в Python?

Как упоминалось ранее, эта ошибка в основном возникает из-за ошибок пробела или табуляции в вашем коде. Поскольку Python использует процедурный язык, вы можете столкнуться с этой ошибкой, если вы не правильно разместили табуляции / пробелы. Программа может работать правильно, но если интерпретатор обнаружит эту ошибку, в середине появится сообщение об ошибке. Некоторые из причин ошибки:

  • Ты используешь и пробелы и табуляции в вашем коде. Если оба они взаимозаменяемы, интерпретатор не сможет определить, какой элемент использовать.
  • Вы поместили отступ неправильно. Если практика отступления не будет соблюдена, эта ошибка неизбежно возникнет.
  • Вы забыли сделать отступ составные высказывания такие как «если», «для», «пока» и т. д.
  • Вы забыли сделать отступ пользовательские функции или классы.

Решение 1. Проверка на наличие неправильных пробелов / вкладок

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

Блочная структура, визуализирующая отступ в PythonБлочная структура, визуализирующая отступ

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

Пример отступа в PythonПример отступа

Правильный отступ показан в примере выше. Смотрите цикл «для» для начинающих. Все внутри цикл «for» должен иметь отступ. Внутри цикла «для» у нас есть выражение «если». Внутри выражения «если» все должно быть в дальнейшем отступ.

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

Решение 2. Включение символов табуляции / пробела в редакторе

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

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

  1. Нажмите Вид> Показать символ> Показать пробелы и TAB
    Включение пробелов и табуляции в PythonВключение пробелов и табуляции — Notepad ++
  1. Теперь опция включена. Вы также можете включить Руководство по отступам так что вам станет легче.

Пример кода с правильным отступом в PythonПример кода с правильным отступом

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

Введение

Примеры

IndentationErrors (или отступ SyntaxErrors)

В большинстве других языков отступ не является обязательным, но в Python (и других языках: ранних версиях FORTRAN, Makefiles, Whitespace (эзотерический язык) и т. Д.) Это не так, что может сбивать с толку, если вы пришли с другого языка если вы копировали код из примера в свой собственный, или просто если вы новичок.

IndentationError / SyntaxError: неожиданный отступ

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

пример

Там нет причин для повышения уровня здесь:

print «Эта строка в порядке» print «Эта строка не в порядке»  print(«Эта строка не в порядке») print(«Эта строка не в порядке»)

Здесь есть две ошибки: последняя и что отступ не соответствует ни одному уровню отступа. Однако показано только одно:

print «Эта строка в порядке» print «Эта строка не в порядке»  print(«Эта строка не в порядке») print(«Эта строка не в порядке»)

IndentationError / SyntaxError: unindent не соответствует ни одному внешнему уровню отступа

Похоже, вы не удалили полностью.

пример

def foo (): print «Это должно быть частью foo ()» print «ERROR!» print «Это не часть foo ()»  print(«Эта строка не в порядке») print(«Эта строка не в порядке»)

IndentationError: ожидается блок с отступом

После двоеточия (а затем и новой строки) уровень отступа должен увеличиться. Эта ошибка возникает, когда этого не произошло.

пример

 if ok:
doStuff()

 

Примечание: Используйте ключевое слово pass (что не делает абсолютно ничего) просто Погружает if , else , за except , class , method или definition , но не сказать , что произойдет , если называется / условие истинно (но сделать это позже, или в случае за except : просто ничего не делать):

 def foo():
    pass

 

IndentationError: противоречивое использование табуляции и пробелов в отступе

пример

 def foo():
    if ok:
      return "Two != Four != Tab"
        return "i dont care i do whatever i want"

 

Как избежать этой ошибки

Не используйте вкладки. Это обескураживает PEP8 , в стиль руководства для Python.

  1. Установите редактор использовать 4 пробелов для отступа.
  2. Сделайте поиск и замените, чтобы заменить все вкладки с 4 пробелами.
  3. Убедитесь , что ваш редактор настроен на отображение вкладок в 8 пробелов, так что вы можете легко реализовать эту ошибку и исправить ее.

Смотрите этот вопрос , если вы хотите , чтобы узнать больше.

TypeErrors

Эти исключения возникают, когда тип какого-либо объекта должен быть другим

Ошибка типа: [определение / метод] занимает? позиционные аргументы, но? был дан

Функция или метод вызывались с большим (или меньшим) количеством аргументов, чем те, которые он может принять.

пример

Если дано больше аргументов:

 def foo(a): return a
foo(a,b,c,d) #And a,b,c,d are defined

 

Если дано меньше аргументов:

 def foo(a,b,c,d): return a += b + c + d
foo(a) #And a is defined

 

Примечание: если вы хотите использовать неизвестное количество аргументов, вы можете использовать *args или **kwargs.См * арг и ** kwargs

Ошибка типа: неподдерживаемые типы операндов для [операнд]: ‘???’ а также ‘???’

Некоторые типы не могут работать вместе, в зависимости от операнда.

пример

Например: + используется для конкатенации и добавить, но вы не можете использовать любой из них для обоих типов. Например, пытаясь сделать set путем конкатенации ( + ю) 'set1' и 'tuple1' дает ошибку. Код:

 set1, tuple1 = {1,2}, (3,4)
a = set1 + tuple1

 

Некоторые виды (например: int и string ) используют как + , но и для различных вещей:

 b = 400 + 'foo'

 

Или они могут даже не использоваться ни для чего:

 c = ["a","b"] - [1,2]

 

Но вы можете, например , добавить float к int :

 d = 1 + 1.0

 

Ошибка типа: ‘???’ объект не повторяем / подписан:

Для объекта быть итерацией он может принимать последовательные индексы , начиная с нуля , пока индексы больше не действительны и IndexError поднято (Технически: он должен иметь __iter__ метод , который возвращает __iterator__ , или который определяет __getitem__ метод , который делает что было упомянуто ранее).

пример

Здесь мы говорим , что bar является нулевым пунктом 1. Глупости:

 foo = 1
bar = foo[0]

 

Это более дискретный вариант: В этом примере for пытается установить x , чтобы amount[0] , первый элемент в качестве итератора , но он не может , поскольку количество представляет собой INT:

 amount = 10
for x in amount: print(x)

 

Ошибка типа: ‘???’ объект не вызывается

Вы определяете переменную и вызываете ее позже (например, что вы делаете с функцией или методом)

пример

 foo = "notAFunction"
foo()

 

NameError: name ‘???’ не определено

Возникает, когда вы пытались использовать переменную, метод или функцию, которые не инициализированы (по крайней мере, до этого). Другими словами, оно возникает, когда запрошенное локальное или глобальное имя не найдено. Вполне возможно , что вы орфографические ошибки имени объекта или забыли import что — то. Также возможно это в другом объеме. Мы рассмотрим их на отдельных примерах.

Это просто не определено нигде в коде

Возможно, вы забыли инициализировать его, особенно если это константа

 foo   # This variable is not defined
bar() # This function is not defined

 

Может быть, это будет определено позже:

 baz()

def baz():
    pass

 

Или это не import изд:

 #needs import math

def sqrt():
    x = float(input("Value: "))
    return math.sqrt(x)


 

Области применения Python и правило LEGB:

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

 Local → Enclosed → Global → Built-in.

 
  • L OCAL: Переменные не объявляются глобальные или назначены в функции.
  • Е nclosing: Переменные , определенные в функции , которая намотана внутри другой функции.
  • G ЛОБАЛЬНЫЕ: Переменные , объявленные глобальные или назначены на верхнем уровне файла.
  • B uilt в: Переменные в наперед заданные имена встроенных модуля.

В качестве примера:

 for i in range(4):
    d = i * 2
print(d)

 

d является доступным , поскольку for цикла не ознаменует новую сферу, но если это так, то мы имели бы ошибку и его поведение будет выглядеть следующим образом:

 def noaccess():
    for i in range(4):
        d = i * 2
noaccess()
print(d)

 

Python говорит NameError: name 'd' is not defined

Другие ошибки

AssertError

assert утверждение существует практически в каждом языке программирования. Когда вы делаете:

 assert condition

 

или же:

 assert condition, message

 

Это эквивалентно этому:

 if __debug__:
    if not condition: raise AssertionError(message)

 

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

Примечание: встроенная переменная отладки Правда при нормальных условиях, Ложные при оптимизации запрашиваемых (опция командной строки -O). Задания для отладки являются незаконными. Значение для встроенной переменной определяется при запуске интерпретатора.

KeyboardInterrupt

Ошибка возникает , когда пользователь нажимает клавишу прерывания обычно Ctrl + C или дель.

ZeroDivisionError

Вы пытались вычислить 1/0 , который не определен. Посмотрите этот пример, чтобы найти делители числа:

div = float (raw_input («Divisors of:»)) для x в xrange (div + 1): # включает само число и ноль, если div / x == div // x: print x, «является делителем» Div  div = int (input («Divisors of:»)) для x в диапазоне (div + 1): # включает само число и ноль, если div / x == div // x: print(x, «является делителем», див)  Он вызывает `ZeroDivisionError`, потому что цикл` for` присваивает это значение `x`. Вместо этого должно быть:  div = float (raw_input («Divisors of:»)) для x в xrange (1, div + 1): # включает в себя само число, но не ноль, если div / x == div // x: print x, «является делитель», див  div = int (input («Divisors of:»)) для x в диапазоне (1, div + 1): # включает само число, но не ноль, если div / x == div // x: print(x, «is делитель», div)

Синтаксическая ошибка в хорошем коде

В большинстве случаев ошибка SyntaxError, указывающая на неинтересную строку, означает, что в строке перед ней есть проблема (в данном примере это пропущенная скобка):

 def my_print():
    x = (1 + 1
    print(x)

 

Возвращает

   File "<input>", line 3
    print(x)
        ^
SyntaxError: invalid syntax

 

Как показано в примере, наиболее распространенной причиной этой проблемы являются несоответствующие скобки / скобки.

В Python 3 есть одно важное предупреждение для операторов печати:

>>> распечатать «Привет мир» Файл » «, строка 1 print» hello world «^ SyntaxError: неверный синтаксис, поскольку [оператор` print` был заменен функцией `print()`] (https://docs.python.org/3/whatsnew/3.0.html # print-is-a-function), так что вы хотите: print(«hello world») # Обратите внимание, что это справедливо как для Py2, так и для Py3

Синтаксис

Параметры

Примечания

Получение «недействительного синтаксиса» в простом обратном выражении практически невозможно. Если вы используете его вне функции, вы получаете 'return' outside function, если у вас есть неправильный отступ, вы получаете IndentationError и т.д.

Единственный способ получить SyntaxError: invalid syntax в операторе return — это, если на самом деле он вообще не говорит return, но если он содержит символы не-ascii, такие как retürn. Это даст эту ошибку. Теперь, как вы можете получить эту ошибку, не видя ее? Опять же, единственная идея, которую я могу придумать, состоит в том, что у вас на самом деле есть отступы, но этот отступ не является пробелами или вкладками. Например, вы можете каким-то образом вставить незашифрованное пространство в свой код.

Да, это может случиться. Да, это случилось со мной. Да, вы получите SyntaxError: invalid syntax.

Lennart Regebro
14 фев. 2011, в 12:21

Поделиться

У меня была та же проблема. Вот мой код:

def gccontent(genomefile):
    nbases = 0
    totalbases = 0
    GC = 0
    for line in genomefile.xreadlines():
        nbases += count(seq, 'N')
        totalbases += len(line)
        GC += count(line, 'G' or 'C')
    gcpercent = (float(GC)/(totalbases - nbases)*100
    return gcpercent

‘return’ имеет недопустимый синтаксис

Мне просто не удалось закрыть скобку по следующему коду:

gcpercent = (float(GC)/(totalbases - nbases)*100

Надеюсь, что это поможет.

Jonathan
14 окт. 2011, в 16:40

Поделиться

Я получил «Недопустимый синтаксис» при возврате, когда забыл закрыть скобку на моем коде.

elif year1==year2 and month1 != month2:
    total_days = (30-day1)+(day2)+((month2-(month1+1))*30   
    return (total_days)    

Недопустимый синтаксис при возврате.

((month2-(month1+1))*30  <---- there should be another bracket

((month2-(month1+1)))*30

Теперь мой код работает.

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

Thuy
11 дек. 2013, в 07:03

Поделиться

Я просто посмотрел на это, потому что у меня была такая же проблема (неверная синтаксическая ошибка в заявлении о возврате плана), и я чрезвычайно новичок в python (первый месяц), поэтому я понятия не имею, что я делаю большую часть времени.

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

emmet
13 нояб. 2015, в 05:32

Поделиться

Обычно это сводная синтаксическая ошибка. Проверьте ошибку.

Jared
01 авг. 2012, в 01:29

Поделиться

>>> 45 return
  File "<stdin>", line 1
    45 return
            ^
SyntaxError: invalid syntax
>>> 

Это может объяснить это. Он не объясняет 44 f = open(filename, 'r'), но я подозреваю, что кто-то скопировал и вставил 45 строк кода, где отступы были потеряны и были включены номера строк.

S.Lott
14 фев. 2011, в 16:44

Поделиться

Ещё вопросы

  • 1Транзакционная аннотация не работает
  • 0Проверка входных данных int C ++
  • 1Как обновить представление при изменении данных в модели?
  • 1Preloader Hidding Effect
  • 0Ошибка: недопустимое значение для <path> attribute d = «.. для круговой диаграммы
  • 0Проблемы с анализом ввода
  • 0angularjs не привязан к сгенерированной привязке
  • 1Hibernate принудительное взаимодействие с «центральной» сущностью
  • 0Мой JavaScript не проверяет радиовходы моей формы правильно
  • 0Как требовать явного приведения
  • 1Самый простой способ получить конкретный тип на основе ввода в C #
  • 0Счетчик JavaScript не работает
  • 0Как выбрать данные sql с помощью двух таблиц соединения с условием ИЛИ без повторяющихся записей
  • 0Найти самую большую сумму из всех, она содержит числа и
  • 1Как получить уверенность в гипотезе результата Sphinx4?
  • 1Подключение приложения Android к HTTP-серверу
  • 1Android installLocation не работает через маркет
  • 1Использование API набора данных TensorFlow приводит к зависанию процесса в деструкторе сеанса
  • 0Как вызвать ссылку (тег) двойным щелчком вместо одного клика? [Дубликат]
  • 1узел-мандрил, отправляющий почту через сервер
  • 0Зачем хранить данные в разных строках в базе данных?
  • 0отключить ссылку якоря стоек после отправки запроса на действие
  • 1Тип org.apache.xmlrpc.common.XmlRpcHttpRequestConfigImpl не может быть разрешен. На него косвенно ссылаются необходимые файлы .class
  • 1Отслеживание таблиц Google в Google Analytics
  • 1WPF DataGrid — связать свойство dataitem как CommandParameter
  • 0Как избежать одиночных кавычек в ng-init
  • 1как включить служебные классы в Eclipse (Android-программирование)
  • 0Перезагрузка нового набора изображений делает высоту div в изотопе 0
  • 1Как передать объект JSON в качестве параметра с URL?
  • 1android — ошибка несовместимости платформы и несовместимости пакета при установке приложения на телефон
  • 0Как я могу удалить ненужную часть изображения с OpenCV, используя C ++?
  • 0Angularjs Фильтр поиска текста ввода с правилом проверки
  • 0Как установить относительные пути в Ui-Router?
  • 0Функция привязки с большим количеством аргументов, чем необходимо, и передача ей определенных аргументов
  • 1Python vtkInterface0.9.3 примеры библиотек не работают
  • 0Фильтровать модель, когда есть нумерация страниц
  • 1WPF Usercontrol изменить размер блока
  • 0JQuery переключатель раскрывающегося меню
  • 0как добавить анимацию CSS на Div нажмите
  • 1Как контролировать межстрочный интервал между текстами GTK
  • 1Как перезагрузить тот же макет на View Flipper в Android?
  • 0Пользовательский диалог javascript / jquery в мобильном приложении не отображается
  • 1Журнал отладки Python не появляется в консоли
  • 1сервлет не передает атрибут сеанса в jsp
  • 1Есть ли алгоритм, который может гарантировать порядок сбора при сохранении O (1) вставки / удаления?
  • 1Как отправить файл данных pandas с помощью метода POST и получить его в Hug / другой среде REST API? pickle.loads не удается распаковать после отправки
  • 1Почему публикация в этом ASP.net MVC сообщения в контроллер приводит к нулевой модели?
  • 1исключение одновременной модификации для заданного итератора
  • 1Java, наследование — закрытое поле в родительском доступе через открытый метод в дочернем
  • 0Ионные два бара-подзаголовка между собой

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

Неверный синтаксис в Python

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

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

*Примечание:* Если ваш код *синтаксически* правильный, то вы можете получить другие исключения, которые не являются `+ SyntaxError +`. Чтобы узнать больше о других исключениях Python и о том, как их обрабатывать, ознакомьтесь с https://realpython.com/python-exceptions/[Python Exceptions: Введение].

Вы не можете обрабатывать неправильный синтаксис в Python, как и другие исключения. Даже если вы попытаетесь обернуть блок + try + и + кроме + вокруг кода с неверным синтаксисом, вы все равно увидите, что интерпретатор вызовет + SyntaxError +.

+ SyntaxError + Исключение и трассировка

Когда интерпретатор обнаруживает неверный синтаксис в коде Python, он вызовет исключение + SyntaxError + и предоставит трассировку с некоторой полезной информацией, которая поможет вам отладить ошибку. Вот некоторый код, который содержит недопустимый синтаксис в Python:

 1 # theofficefacts.py
 2 ages = {
 3     'pam': 24,
 4     'jim': 24
 5     'michael': 43
 6 }
 7 print(f'Michael is {ages["michael"]} years old.')

Вы можете увидеть недопустимый синтаксис в литерале словаря в строке 4. Во второй записи + 'jim' + пропущена запятая. Если вы попытаетесь запустить этот код как есть, вы получите следующую трассировку:

$ python theofficefacts.py
File "theofficefacts.py", line 5
    'michael': 43
            ^
SyntaxError: invalid syntax

Обратите внимание, что сообщение трассировки обнаруживает ошибку в строке 5, а не в строке 4. Интерпретатор Python пытается указать, где находится неправильный синтаксис. Тем не менее, он может только указать, где он впервые заметил проблему. Когда вы получите трассировку + SyntaxError + и код, на который указывает трассировка, выглядит нормально, тогда вы захотите начать движение назад по коду, пока не сможете определить, что не так.

В приведенном выше примере нет проблемы с запятой, в зависимости от того, что следует после нее. Например, нет проблемы с отсутствующей запятой после + 'michael' + в строке 5. Но как только переводчик сталкивается с чем-то, что не имеет смысла, он может лишь указать вам на первое, что он обнаружил, что он не может понять.

*Примечание:* В этом руководстве предполагается, что вы знакомы с основами *tracebacks* в Python. Чтобы узнать больше о трассировке Python и о том, как их читать, ознакомьтесь с https://realpython.com/python-traceback/[Understanding Python Traceback].

Существует несколько элементов трассировки + SyntaxError +, которые могут помочь вам определить, где в вашем коде содержится неверный синтаксис:

  • Имя файла , где встречается неверный синтаксис

  • Номер строки и воспроизводимая строка кода, где возникла проблема

  • Знак (+ ^ +) в строке ниже воспроизводимого кода, который показывает точку в коде, которая имеет проблему

  • Сообщение об ошибке , которое следует за типом исключения + SyntaxError +, которое может предоставить информацию, которая поможет вам определить проблему

В приведенном выше примере имя файла было + theofficefacts.py +, номер строки был 5, а каретка указывала на закрывающую кавычку из словарного ключа + michael +. Трассировка + SyntaxError + может не указывать на реальную проблему, но она будет указывать на первое место, где интерпретатор не может понять синтаксис.

Есть два других исключения, которые вы можете увидеть в Python. Они эквивалентны + SyntaxError +, но имеют разные имена:

  1. + + IndentationError

  2. + + TabError

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

Общие проблемы с синтаксисом

Когда вы впервые сталкиваетесь с + SyntaxError +, полезно знать, почему возникла проблема и что вы можете сделать, чтобы исправить неверный синтаксис в вашем коде Python. В следующих разделах вы увидите некоторые из наиболее распространенных причин, по которым может быть вызвано «+ SyntaxError +», и способы их устранения.

Неправильное использование оператора присваивания (+ = +)

В Python есть несколько случаев, когда вы не можете назначать объекты. Некоторые примеры присваивают литералам и вызовам функций. В приведенном ниже блоке кода вы можете увидеть несколько примеров, которые пытаются это сделать, и получающиеся в результате трассировки + SyntaxError +:

>>>

>>> len('hello') = 5
  File "<stdin>", line 1
SyntaxError: can't assign to function call

>>> 'foo' = 1
  File "<stdin>", line 1
SyntaxError: can't assign to literal

>>> 1 = 'foo'
  File "<stdin>", line 1
SyntaxError: can't assign to literal

Первый пример пытается присвоить значение + 5 + вызову + len () +. Сообщение + SyntaxError + очень полезно в этом случае. Он говорит вам, что вы не можете присвоить значение вызову функции.

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

*Примечание:* В приведенных выше примерах отсутствует повторяющаяся строка кода и каретка (`+ ^ +`), указывающая на проблему в трассировке. Исключение и обратная трассировка, которые вы видите, будут другими, когда вы находитесь в REPL и пытаетесь выполнить этот код из файла. Если бы этот код был в файле, то вы бы получили повторяющуюся строку кода и указали на проблему, как вы видели в других случаях в этом руководстве.

Вероятно, ваше намерение не состоит в том, чтобы присвоить значение литералу или вызову функции. Например, это может произойти, если вы случайно пропустите дополнительный знак равенства (+ = +), что превратит назначение в сравнение. Сравнение, как вы можете видеть ниже, будет правильным:

>>>

>>> len('hello') == 5
True

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

Неправильное написание, отсутствие или неправильное использование ключевых слов Python

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

Существует три распространенных способа ошибочного использования ключевых слов:

  1. Неправильное написание ключевое слово

  2. Отсутствует ключевое слово

  3. Неправильное использование ключевого слова

Если вы неправильно написали ключевое слово в своем коде Python, вы получите + SyntaxError +. Например, вот что происходит, если вы пишете ключевое слово + for + неправильно:

>>>

>>> fro i in range(10):
  File "<stdin>", line 1
    fro i in range(10):
        ^
SyntaxError: invalid syntax

Сообщение читается как + SyntaxError: неверный синтаксис +, но это не очень полезно. Трассировка указывает на первое место, где Python может обнаружить, что что-то не так. Чтобы исправить эту ошибку, убедитесь, что все ваши ключевые слова Python написаны правильно.

Другая распространенная проблема с ключевыми словами — это когда вы вообще их пропускаете:

>>>

>>> for i range(10):
  File "<stdin>", line 1
    for i range(10):
              ^
SyntaxError: invalid syntax

Еще раз, сообщение об исключении не очень полезно, но трассировка действительно пытается указать вам правильное направление. Если вы отойдете от каретки, то увидите, что ключевое слово + in + отсутствует в синтаксисе цикла + for +.

Вы также можете неправильно использовать защищенное ключевое слово Python. Помните, что ключевые слова разрешено использовать только в определенных ситуациях. Если вы используете их неправильно, у вас будет неправильный синтаксис в коде Python. Типичным примером этого является использование https://realpython.com/python-for-loop/#the-break-and-continue-statements [+ continue + или + break +] вне цикла. Это может легко произойти во время разработки, когда вы реализуете вещи и когда-то перемещаете логику за пределы цикла:

>>>

>>> names = ['pam', 'jim', 'michael']
>>> if 'jim' in names:
...     print('jim found')
...     break
...
  File "<stdin>", line 3
SyntaxError: 'break' outside loop

>>> if 'jim' in names:
...     print('jim found')
...     continue
...
  File "<stdin>", line 3
SyntaxError: 'continue' not properly in loop

Здесь Python отлично говорит, что именно не так. Сообщения " 'break' вне цикла " и " 'continue' не в цикле должным образом " помогут вам точно определить, что делать. Если бы этот код был в файле, то Python также имел бы курсор, указывающий прямо на неправильно использованное ключевое слово.

Другой пример — если вы пытаетесь назначить ключевое слово Python переменной или использовать ключевое слово для определения функции:

>>>

>>> pass = True
  File "<stdin>", line 1
    pass = True
         ^
SyntaxError: invalid syntax

>>> def pass():
  File "<stdin>", line 1
    def pass():
           ^
SyntaxError: invalid syntax

Когда вы пытаетесь присвоить значение + pass +, или когда вы пытаетесь определить новую функцию с именем + pass +, вы получите ` + SyntaxError + и снова увидеть сообщение + «неверный синтаксис» + `.

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

Список защищенных ключевых слов менялся с каждой новой версией Python. Например, в Python 3.6 вы можете использовать + await + в качестве имени переменной или имени функции, но в Python 3.7 это слово было добавлено в список ключевых слов. Теперь, если вы попытаетесь использовать + await + в качестве имени переменной или функции, это вызовет + SyntaxError +, если ваш код для Python 3.7 или более поздней версии.

Другим примером этого является + print +, который отличается в Python 2 от Python 3:

Version print Type Takes A Value

Python 2

keyword

no

Python 3

built-in function

yes

+ print + — это ключевое слово в Python 2, поэтому вы не можете присвоить ему значение. Однако в Python 3 это встроенная функция, которой можно присваивать значения.

Вы можете запустить следующий код, чтобы увидеть список ключевых слов в любой версии Python, которую вы используете:

import keyword
print(keyword.kwlist)

+ keyword + также предоставляет полезную + keyword.iskeyword () +. Если вам просто нужен быстрый способ проверить переменную + pass +, то вы можете использовать следующую однострочную строку:

>>>

>>> import keyword; keyword.iskeyword('pass')
True

Этот код быстро сообщит вам, является ли идентификатор, который вы пытаетесь использовать, ключевым словом или нет.

Отсутствующие скобки, скобки и цитаты

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

>>>

>>> message = 'don't'
  File "<stdin>", line 1
    message = 'don't'
                   ^
SyntaxError: invalid syntax

Здесь трассировка указывает на неверный код, где после закрывающей одинарной кавычки стоит + t '+. Чтобы это исправить, вы можете сделать одно из двух изменений:

  1. Escape одиночная кавычка с обратной косой чертой (+ 'don ' t '+)

  2. Окружить всю строку в двойных кавычках (" не ")

Другая распространенная ошибка — забыть закрыть строку. Как для строк с двойными, так и с одинарными кавычками ситуация и обратная трассировка одинаковы:

>>>

>>> message = "This is an unclosed string
  File "<stdin>", line 1
    message = "This is an unclosed string
                                        ^
SyntaxError: EOL while scanning string literal

На этот раз каретка в трассировке указывает прямо на код проблемы. Сообщение + SyntaxError +, " EOL при сканировании строкового литерала ", немного более конкретно и полезно при определении проблемы. Это означает, что интерпретатор Python дошел до конца строки (EOL) до закрытия открытой строки. Чтобы это исправить, закройте строку с кавычкой, которая совпадает с той, которую вы использовали для ее запуска. В этом случае это будет двойная кавычка (`+» + `).

Кавычки, отсутствующие в инструкциях внутри f-string, также могут привести к неверному синтаксису в Python:

 1 # theofficefacts.py
 2 ages = {
 3     'pam': 24,
 4     'jim': 24,
 5     'michael': 43
 6 }
 7 print(f'Michael is {ages["michael]} years old.')

Здесь, ссылка на словарь + ages + внутри напечатанной f-строки пропускает закрывающую двойную кавычку из ссылки на ключ. Итоговая трассировка выглядит следующим образом:

$ python theofficefacts.py
  File "theofficefacts.py", line 7
    print(f'Michael is {ages["michael]} years old.')
         ^
SyntaxError: f-string: unterminated string

Python идентифицирует проблему и сообщает, что она существует внутри f-строки. Сообщение " неопределенная строка " также указывает на проблему. Каретка в этом случае указывает только на начало струны.

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

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

# missing.py
def foo():
    return [1, 2, 3

print(foo())

Когда вы запустите этот код, вам скажут, что есть проблема с вызовом + print () +:

$ python missing.py
  File "missing.py", line 5
    print(foo())
        ^
SyntaxError: invalid syntax

Здесь происходит то, что Python думает, что список содержит три элемента: + 1 +, + 2 + и +3 print (foo ()) +. Python использует whitespace для логической группировки вещей, и потому что нет запятой или скобки, отделяющей + 3 + от `+ print (foo ()) + `, Python объединяет их вместе как третий элемент списка.

Еще один вариант — добавить запятую после последнего элемента в списке, оставляя при этом закрывающую квадратную скобку:

# missing.py
def foo():
    return [1, 2, 3,

print(foo())

Теперь вы получаете другую трассировку:

$ python missing.py
  File "missing.py", line 6

                ^
SyntaxError: unexpected EOF while parsing

В предыдущем примере + 3 + и + print (foo ()) + были объединены в один элемент, но здесь вы видите запятую, разделяющую два. Теперь вызов + print (foo ()) + добавляется в качестве четвертого элемента списка, и Python достигает конца файла без закрывающей скобки. В трассировке говорится, что Python дошел до конца файла (EOF), но ожидал чего-то другого.

В этом примере Python ожидал закрывающую скобку (+] +), но повторяющаяся строка и каретка не очень помогают. Отсутствующие круглые скобки и скобки сложно определить Python. Иногда единственное, что вы можете сделать, это начать с каретки и двигаться назад, пока вы не сможете определить, чего не хватает или что нет.

Ошибочный синтаксис словаря

Вы видели ссылку: # syntaxerror-exception-and-traceback [ранее], чтобы вы могли получить + SyntaxError +, если не указывать запятую в словарном элементе. Другая форма недопустимого синтаксиса в словарях Python — это использование знака равенства (+ = +) для разделения ключей и значений вместо двоеточия:

>>>

>>> ages = {'pam'=24}
  File "<stdin>", line 1
    ages = {'pam'=24}
                 ^
SyntaxError: invalid syntax

Еще раз, это сообщение об ошибке не очень полезно. Повторная линия и каретка, однако, очень полезны! Они указывают прямо на характер проблемы.

Этот тип проблемы распространен, если вы путаете синтаксис Python с синтаксисом других языков программирования. Вы также увидите это, если перепутаете определение словаря с вызовом + dict () +. Чтобы это исправить, вы можете заменить знак равенства двоеточием. Вы также можете переключиться на использование + dict () +:

>>>

>>> ages = dict(pam=24)
>>> ages
{'pam': 24}

Вы можете использовать + dict () + для определения словаря, если этот синтаксис более полезен.

Использование неправильного отступа

Существует два подкласса + SyntaxError +, которые конкретно занимаются проблемами отступов:

  1. + + IndentationError

  2. + + TabError

В то время как другие языки программирования используют фигурные скобки для обозначения блоков кода, Python использует whitespace. Это означает, что Python ожидает, что пробелы в вашем коде будут вести себя предсказуемо. Он вызовет + IndentationError + , если в блоке кода есть строка с неправильным количеством пробелов:

 1 # indentation.py
 2 def foo():
 3     for i in range(10):
 4         print(i)
 5   print('done')
 6
 7 foo()

Это может быть сложно увидеть, но в строке 5 есть только два пробела с отступом. Он должен соответствовать выражению цикла + for +, которое на 4 пробела больше. К счастью, Python может легко определить это и быстро расскажет вам, в чем проблема.

Здесь также есть некоторая двусмысленность. Является ли строка + print ('done') + after циклом + for + или inside блоком цикла + for +? Когда вы запустите приведенный выше код, вы увидите следующую ошибку:

$ python indentation.py
  File "indentation.py", line 5
    print('done')
                ^
IndentationError: unindent does not match any outer indentation level

Хотя трассировка выглядит во многом как трассировка + SyntaxError +, на самом деле это + IndentationError +. Сообщение об ошибке также очень полезно. Он говорит вам, что уровень отступа строки не соответствует ни одному другому уровню отступа. Другими словами, + print ('done') + это отступ с двумя пробелами, но Python не может найти любую другую строку кода, соответствующую этому уровню отступа. Вы можете быстро это исправить, убедившись, что код соответствует ожидаемому уровню отступа.

Другой тип + SyntaxError + — это + TabError + , который вы будете видеть всякий раз, когда есть строка, содержащая либо табуляцию, либо пробелы для отступа, в то время как остальная часть файла содержит другую. Это может скрыться, пока Python не покажет это вам!

Если размер вкладки равен ширине пробелов на каждом уровне отступа, то может показаться, что все строки находятся на одном уровне. Однако, если одна строка имеет отступ с использованием пробелов, а другая — с помощью табуляции, Python укажет на это как на проблему:

 1 # indentation.py
 2 def foo():
 3     for i in range(10):
 4         print(i)
 5     print('done')
 6
 7 foo()

Здесь строка 5 имеет отступ вместо 4 пробелов. Этот блок кода может выглядеть идеально для вас, или он может выглядеть совершенно неправильно, в зависимости от настроек вашей системы.

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

$ tabs 4 # Sets the shell tab width to 4 spaces
$ cat -n indentation.py
     1   # indentation.py
     2   def foo():
     3       for i in range(10)
     4           print(i)
     5       print('done')
     6
     7   foo()

$ tabs 8 # Sets the shell tab width to 8 spaces (standard)
$ cat -n indentation.py
     1   # indentation.py
     2   def foo():
     3       for i in range(10)
     4           print(i)
     5           print('done')
     6
     7   foo()

$ tabs 3 # Sets the shell tab width to 3 spaces
$ cat -n indentation.py
     1   # indentation.py
     2   def foo():
     3       for i in range(10)
     4           print(i)
     5      print('done')
     6
     7   foo()

Обратите внимание на разницу в отображении между тремя примерами выше. Большая часть кода использует 4 пробела для каждого уровня отступа, но строка 5 использует одну вкладку во всех трех примерах. Ширина вкладки изменяется в зависимости от настройки tab width :

  • Если ширина вкладки равна 4 , то оператор + print + будет выглядеть так, как будто он находится вне цикла + for +. Консоль выведет + 'done' + в конце цикла.

  • Если ширина табуляции равна 8 , что является стандартным для многих систем, то оператор + print + будет выглядеть так, как будто он находится внутри цикла + for +. Консоль будет печатать + 'done' + после каждого числа.

  • Если ширина табуляции равна 3 , то оператор + print + выглядит неуместно. В этом случае строка 5 не соответствует ни одному уровню отступа.

Когда вы запустите код, вы получите следующую ошибку и трассировку:

$ python indentation.py
  File "indentation.py", line 5
    print('done')
                ^
TabError: inconsistent use of tabs and spaces in indentation

Обратите внимание на + TabError + вместо обычного + SyntaxError +. Python указывает на проблемную строку и дает вам полезное сообщение об ошибке. Это ясно говорит о том, что в одном и том же файле для отступа используется смесь вкладок и пробелов.

Решение этой проблемы состоит в том, чтобы все строки в одном и том же файле кода Python использовали либо табуляции, либо пробелы, но не обе. Для приведенных выше блоков кода исправление будет состоять в том, чтобы удалить вкладку и заменить ее на 4 пробела, которые будут печатать + 'done' + после завершения цикла + for +.

Определение и вызов функций

Вы можете столкнуться с неверным синтаксисом в Python, когда вы определяете или вызываете функции. Например, вы увидите + SyntaxError +, если будете использовать точку с запятой вместо двоеточия в конце определения функции:

>>>

>>> def fun();
  File "<stdin>", line 1
    def fun();
             ^
SyntaxError: invalid syntax

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

Кроме того, ключевые аргументы как в определениях функций, так и в вызовах функций должны быть в правильном порядке. Аргументы ключевых слов always идут после позиционных аргументов. Отказ от использования этого порядка приведет к + SyntaxError +:

>>>

>>> def fun(a, b):
...     print(a, b)
...
>>> fun(a=1, 2)
  File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument

Здесь, еще раз, сообщение об ошибке очень полезно, чтобы рассказать вам точно, что не так со строкой.

Изменение версий Python

Иногда код, который прекрасно работает в одной версии Python, ломается в более новой версии. Это связано с официальными изменениями в синтаксисе языка. Наиболее известным примером этого является оператор + print +, который перешел от ключевого слова в Python 2 к встроенной функции в Python 3:

>>>

>>> # Valid Python 2 syntax that fails in Python 3
>>> print 'hello'
  File "<stdin>", line 1
    print 'hello'
                ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print('hello')?

Это один из примеров, где появляется сообщение об ошибке, сопровождающее + SyntaxError +! Он не только сообщает вам, что в вызове + print + отсутствует скобка, но также предоставляет правильный код, который поможет вам исправить оператор.

Другая проблема, с которой вы можете столкнуться, — это когда вы читаете или изучаете синтаксис, который является допустимым синтаксисом в более новой версии Python, но недопустим в той версии, в которую вы пишете. Примером этого является синтаксис f-string, которого нет в версиях Python до 3.6:

>>>

>>> # Any version of python before 3.6 including 2.7
>>> w ='world'
>>> print(f'hello, {w}')
  File "<stdin>", line 1
    print(f'hello, {w}')
                      ^
SyntaxError: invalid syntax

В версиях Python до 3.6 интерпретатор ничего не знает о синтаксисе f-строки и просто предоставляет общее сообщение «» неверный синтаксис «`. Проблема, в данном случае, в том, что код looks прекрасно работает, но он был запущен с более старой версией Python. В случае сомнений перепроверьте, какая версия Python у вас установлена!

Синтаксис Python продолжает развиваться, и в Python 3.8 появилось несколько интересных новых функций:

  • Walrus оператор (выражения присваивания)

  • F-string синтаксис для отладки
    *https://docs.python.org/3.8/whatsnew/3.8.html#positional-only-parameters[Positional-only arguments]

Если вы хотите опробовать некоторые из этих новых функций, то вам нужно убедиться, что вы работаете в среде Python 3.8. В противном случае вы получите + SyntaxError +.

Python 3.8 также предоставляет новый* + SyntaxWarning + *. Вы увидите это предупреждение в ситуациях, когда синтаксис допустим, но все еще выглядит подозрительно. Примером этого может быть отсутствие запятой между двумя кортежами в списке. Это будет действительный синтаксис в версиях Python до 3.8, но код вызовет + TypeError +, потому что кортеж не может быть вызван:

>>>

>>> [(1,2)(2,3)]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object is not callable

Этот + TypeError + означает, что вы не можете вызывать кортеж, подобный функции, что, как думает интерпретатор Python, вы делаете.

В Python 3.8 этот код все еще вызывает + TypeError +, но теперь вы также увидите + SyntaxWarning +, который указывает, как вы можете решить проблему:

>>>

>>> [(1,2)(2,3)]
<stdin>:1: SyntaxWarning: 'tuple' object is not callable; perhaps you missed a comma?
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object is not callable

Полезное сообщение, сопровождающее новый + SyntaxWarning +, даже дает подсказку (" возможно, вы пропустили запятую? "), Чтобы указать вам правильное направление!

Заключение

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

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

Получение + SyntaxError + во время изучения Python может быть неприятным, но теперь вы знаете, как понимать сообщения трассировки и с какими формами недопустимого синтаксиса в Python вы можете столкнуться. В следующий раз, когда вы получите + SyntaxError +, у вас будет больше возможностей быстро решить проблему!

Понравилась статья? Поделить с друзьями:
  • Синтаксическая ошибка при установке сбербанк что делать
  • Синтаксическая ошибка при установке приложения на андроид что это такое
  • Синий экран смерти windows 10 где посмотреть ошибки
  • Синтаксическая ошибка при установке приложения на андроид что это означает
  • Синий экран смерти windows 10 whea uncorrectable error как исправить