Pythonの無効な構文:SyntaxErrorの一般的な理由
Pythonは単純な構文で知られています。 ただし、Pythonを初めて学習するとき、または別のプログラミング言語での強固なバックグラウンドでPythonを使用するときには、Pythonで許可されていないことが発生する可能性があります。 Pythonコードを実行しようとしたときに + SyntaxError +
を受け取ったことがある場合は、このガイドが役立ちます。 このチュートリアルでは、Pythonでの無効な構文の一般的な例を参照し、問題を解決する方法を学びます。
このチュートリアルが終了すると、次のことができるようになります。
-
Pythonで*無効な構文*を識別する
-
+ SyntaxError +
トレースバックを理解する -
無効な構文を*解決*または完全に防止する
無料ボーナス: link:[5 Thoughts On Python Mastery]、Python開発者向けの無料コースで、Pythonのスキルを次のレベルに引き上げるのに必要なロードマップと考え方を示します。
Pythonの無効な構文
Pythonコードを実行すると、インタープリターはまず解析してPythonバイトコードに変換し、実行します。 インタープリターは、プログラム実行のこの最初の段階(解析段階)でPythonの無効な構文を検出します。 インタープリターがPythonコードを正常に解析できない場合、これはコードのどこかで無効な構文を使用したことを意味します。 インタープリターは、そのエラーが発生した場所を表示しようとします。
Pythonを初めて学ぶとき、 `+ SyntaxError +`を取得するのはイライラする可能性があります。 Pythonは、コード内の無効な構文がどこにあるのかを判別しようとしますが、それが提供するhttps://realpython.com/python-traceback/[traceback]は少し混乱する可能性があります。 時には、それが指すコードが完全にうまくいくこともあります。
*注:*コードが*構文的に*正しい場合、 `+ SyntaxError +`以外の例外が発生する可能性があります。 Pythonの他の例外とその処理方法の詳細については、https://realpython.com/python-exceptions/[Python例外:はじめに]をご覧ください。
他の例外のようにPythonで無効な構文を処理することはできません。 無効な構文のコードを「+ try 」および「 except 」ブロックでラップしようとしても、インタープリターが「 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行目の辞書リテラルで無効な構文を確認できます。 2番目のエントリ `+ 'jim' +`にはコンマがありません。 このコードをそのまま実行しようとすると、次のトレースバックが表示されます。
$ python theofficefacts.py
File "theofficefacts.py", line 5
'michael': 43
^
SyntaxError: invalid syntax
トレースバックメッセージは、4行目ではなく5行目でエラーを見つけていることに注意してください。 Pythonインタープリターは、無効な構文がどこにあるかを指摘しようとしています。 ただし、実際に問題に最初に気付いた場所のみを指すことができます。 `+ SyntaxError +`トレースバックを取得し、トレースバックが指しているコードが正常に見える場合、何が問題なのか判断できるまでコードを逆方向に移動し始めます。
上記の例では、コンマを省略しても問題はありませんが、その後の内容によって異なります。 たとえば、5行目の `+ 'michael' +`の後にコンマがなくても問題はありません。 しかし、通訳者が意味をなさない何かに出くわすと、理解できなかったことが最初にわかったことを示すことができます。
*注:*このチュートリアルでは、Pythonの*トレースバック*の基本を理解していることを前提としています。 Pythonトレースバックとその読み方の詳細については、https://realpython.com/python-traceback/[Understanding the Python Traceback]をご覧ください。
無効な構文がコード内のどこにあるかを判断するのに役立つ「+ SyntaxError +」トレースバックの要素がいくつかあります。
-
*ファイル名*無効な構文が検出された場所
-
*問題が発生した行番号*と再現されたコード行
-
再生されたコードの下の行にあるキャレット(
+ ^ +
)。問題のあるコードのポイントを示します。 -
例外タイプ `+ SyntaxError +`の後に表示されるエラーメッセージ。問題の特定に役立つ情報を提供できます。
上記の例では、指定されたファイル名は「+ theofficefacts.py 」、行番号は5、キャレットは辞書キー「 michael 」の閉じ引用符を指していました。 ` SyntaxError +`トレースバックは実際の問題を指し示していない場合がありますが、インタープリターが構文を理解できなかった最初の場所を指し示します。
Pythonが発生する可能性がある2つの例外があります。 これらは `+ SyntaxError +`と同等ですが、名前は異なります。
-
+ IndentationError +
-
+ 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 +`メッセージは非常に役立ちます。 関数呼び出しに値を割り当てることができないことがわかります。
2番目と3番目の例では、リテラルに文字列と整数を割り当てます。 他のリテラル値にも同じルールが当てはまります。 この場合も、トレースバックメッセージは、リテラルに値を割り当てようとしたときに問題が発生したことを示します。
*注意:*上記の例には、トレースバックの問題を指すコード行とキャレット( + ^ +
)が繰り返されていません。 表示される例外とトレースバックは、REPLを使用する場合とファイルからこのコードを実行しようとする場合で異なります。 このコードがファイル内にある場合、このチュートリアル全体で他のケースで見たように、問題を指すコード行とキャレットが繰り返されます。
あなたの意図は、リテラルまたは関数呼び出しに値を割り当てることではない可能性があります。 たとえば、偶発的に余分な等号( + = +
)を省略した場合、これが発生する可能性があり、これにより割り当てが比較になります。 以下に示すように、比較は有効です。
>>>
>>> len('hello') == 5
True
ほとんどの場合、Pythonから、割り当てられないものに割り当てを行っていると言われたら、最初にステートメントがブール式になっていないことを確認する必要があります。 次のセクションで説明するPythonキーワードに値を割り当てようとしているときにも、この問題が発生する可能性があります。
Pythonキーワードのスペルミス、欠落、または誤用
Pythonキーワードは、Pythonで特別な意味を持つ*保護された単語*のセットです。 これらは、コードで識別子、変数、または関数名として使用できない単語です。 これらは言語の一部であり、Pythonで許可されているコンテキストでのみ使用できます。
キーワードを誤って使用する可能性がある3つの一般的な方法があります。
-
キーワードのミススペル * . 欠落*キーワード
-
*誤用*キーワード
Pythonコードでキーワードを*スペルミス*すると、 `+ SyntaxError `が表示されます。 たとえば、キーワード「 for +」のスペルを間違えた場合は次のようになります。
>>>
>>> fro i in range(10):
File "<stdin>", line 1
fro i in range(10):
^
SyntaxError: invalid syntax
メッセージには「+ SyntaxError:invalid syntax +」と表示されますが、それはあまり役に立ちません。 トレースバックは、何かが間違っていることをPythonが検出できる最初の場所を指します。 この種のエラーを修正するには、すべてのPythonキーワードのスペルが正しいことを確認してください。
キーワードに関するもう1つの一般的な問題は、それらを完全に*見逃す*場合です。
>>>
>>> for i range(10):
File "<stdin>", line 1
for i range(10):
^
SyntaxError: invalid syntax
繰り返しますが、例外メッセージはそれほど役に立ちませんが、トレースバックは正しい方向を指し示しようとします。 キャレットから戻ると、 `+ for `ループ構文から ` in +`キーワードが欠落していることがわかります。
保護された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' outside loop" + `」および「" 'continue' not適切にループ内にありません」 `は、何をすべきかを正確に把握するのに役立ちます。 このコードがファイル内にある場合、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 + `と
+ "invalid syntax" + `メッセージが再び表示されます。
コードは外部からは見栄えが良いので、Pythonコードでこのタイプの無効な構文を解決するのは少し難しいかもしれません。 コードの見た目は良いが、まだ+ SyntaxError + `が表示される場合は、使用しているPythonのバージョンのキーワードリストに対して、使用する変数名または関数名を確認することを検討してください。
保護されたキーワードのリストは、Pythonの新しいバージョンごとに変更されています。 たとえば、Python 3.6では、変数名または関数名として「+ await 」を使用できますが、Python 3.7では、その単語がキーワードリストに追加されました。 これで、変数または関数名として「 await 」を使用しようとすると、コードがPython 3.7以降用の場合、「 SyntaxError +」が発生します。
この別の例はhttps://realpython.com/python-print/[+ print +
]で、Python 2とPython 3で異なります:
Version | print Type |
Takes A Value |
---|---|---|
keyword |
no |
|
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」+がある無効なコードを指します。 これを修正するには、次の2つの変更のいずれかを行います。
-
*エスケープ*バックスラッシュで一重引用符(
+ 'don \' t '+
) -
*サラウンド*文字列全体を二重引用符で囲みます(
" do n't "
)
もう1つのよくある間違いは、文字列を閉じるのを忘れることです。 二重引用符と単一引用符の両方の文字列では、状況とトレースバックは同じです。
>>>
>>> message = "This is an unclosed string
File "<stdin>", line 1
message = "This is an unclosed string
^
SyntaxError: EOL while scanning string literal
今回は、トレースバックのキャレットが問題のあるコードを指し示しています。 `+ SyntaxError `メッセージ、 `" EOL while文字列リテラルをスキャン中 "`は、問題を特定するのにもう少し具体的で役立ちます。 これは、開いている文字列が閉じる前に、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.')
ここでは、印刷されたf-string内の `+ ages +`辞書への参照に、キー参照からの二重引用符がありません。 結果のトレースバックは次のとおりです。
$ python theofficefacts.py
File "theofficefacts.py", line 7
print(f'Michael is {ages["michael]} years old.')
^
SyntaxError: f-string: unterminated string
Pythonは問題を特定し、f-string内に存在することを通知します。 メッセージ `" unterminated string "`も問題の内容を示しています。 この場合のキャレットは、f文字列の先頭のみを指します。
これは、キャレットがf-stringの問題領域を指している場合ほど有用ではないかもしれませんが、見る必要がある場所を絞り込みます。 そのf-string内のどこかに終端文字列があります。 あなたはただどこを見つける必要があります。 この問題を解決するには、すべての内部f-string引用符と角かっこが存在することを確認してください。
状況は、括弧と括弧がない場合でもほとんど同じです。 たとえば、リストから閉じ角括弧を省略した場合、Pythonはそれを見つけて指摘します。 ただし、これにはいくつかのバリエーションがあります。 1つ目は、リストから閉じ括弧を外すことです。
# 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はリストに3つの要素、「+ 1 」、「 2+」、および「3 print(foo())」が含まれていると考えているということです。 Pythonはhttps://realpython.com/lessons/whitespace-expressions-and-statements/[whitespace]を使用して物事を論理的にグループ化します。これは、 + print(foo())から
+ 3 + `を区切るコンマまたはブラケットがないためです。 + `、Pythonはそれらをリストの3番目の要素としてまとめます。
別のバリエーションは、リストの最後の要素の後に末尾のコンマを追加する一方で、閉じ角括弧を省くことです:
# 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())`は1つの要素としてまとめられていましたが、ここでは2つを区切るコンマが表示されています。 これで、 ` print(foo())+`の呼び出しがリストの4番目の要素として追加され、Pythonは閉じ括弧なしでファイルの最後に到達します。 トレースバックは、Pythonがファイルの最後(EOF)に到達したことを示していますが、何か他のものを予期していました。
この例では、Pythonは右大括弧( +] +
)を予期していましたが、行とキャレットの繰り返しはあまり役に立ちません。 括弧と括弧が欠落していると、Pythonが特定するのが困難です。 できることは、キャレットから始めて、何が足りないか間違っているかを特定できるまで後退することだけです。
辞書の構文を間違えた
link:#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 +`の2つのサブクラスがあります。
-
+ IndentationError +
-
+ TabError +
他のプログラミング言語は中括弧を使用してコードのブロックを示しますが、Pythonはhttps://realpython.com/lessons/whitespace-expressions-and-statements/[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行目は2スペースだけインデントされています。 これは、4スペース上にある「+ for +」ループステートメントと一致している必要があります。 ありがたいことに、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')+`は2スペース分インデントされますが、Pythonはこのレベルのインデントに一致する他のコード行を見つけることができません。 コードを予想されるインデントレベルに合わせることで、これをすばやく修正できます。
もう1つのタイプの「+ SyntaxError 」は *` TabError +`* で、インデント用のタブまたはスペースを含む行があり、ファイルの残りの部分に他の行が含まれている場合に表示されます。 Pythonが指摘するまで、これは隠されるかもしれません!
タブサイズが各インデントレベルのスペース数と同じ幅である場合、すべての行が同じレベルにあるように見える場合があります。 ただし、1行がスペースを使用してインデントされ、もう1行がタブでインデントされている場合、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()
上記の3つの例の表示の違いに注意してください。 ほとんどのコードは各インデントレベルに4つのスペースを使用しますが、5行目では3つの例すべてで1つのタブを使用しています。 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
通常の `+ SyntaxError `の代わりに ` TabError +`に注意してください。 Pythonは問題のある行を指摘し、役立つエラーメッセージを提供します。 同じファイルにインデントに使用されるタブとスペースが混在していることが明確にわかります。
これに対する解決策は、同じPythonコードファイル内のすべての行でタブまたはスペースのいずれかを使用し、両方を使用しないようにすることです。 上記のコードブロックの場合、修正はタブを削除して4つのスペースに置き換えることで、「+ for 」ループの終了後に「 'done' +」が出力されます。
関数の定義と呼び出し
関数を定義または呼び出しているときに、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の1つのバージョンで完全に機能するコードが、新しいバージョンで壊れることがあります。 これは、言語構文の公式な変更によるものです。 この最も有名な例は、Python 2のキーワードからPython 3の組み込み関数に移行した `+ print +`ステートメントです。
>>>
>>> # 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 `で提供されるエラーメッセージが輝く例の1つです! ` print +`呼び出しで括弧が欠落していることを知らせるだけでなく、ステートメントの修正に役立つ正しいコードも提供します。
発生する可能性のある別の問題は、新しいバージョンのPythonでは有効な構文ですが、作成中のバージョンでは有効ではない構文を読んだり学習したりすることです。 この例は、https://realpython.com/python-f-strings/[f-string]構文です。これは、3.6より前のPythonバージョンには存在しません。
>>>
>>> # 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
3.6より前のバージョンのPythonでは、インタープリターはf-string構文について何も知らず、一般的な `" invalid syntax "`メッセージのみを提供します。 この場合の問題は、コードが_looks_完全にうまくいくが、それが古いバージョンのPythonで実行されたことです。 疑問がある場合は、実行しているPythonのバージョンを再確認してください。
Python構文は進化を続けており、https://realpython.com/python38-new-features/[Python 3.8]にいくつかのクールな新機能が導入されています。
これらの新機能を試してみたい場合は、Python 3.8環境で作業していることを確認する必要があります。 そうでない場合は、「+ SyntaxError +」が発生します。
Python 3.8は、新しい + SyntaxWarning +
も提供します。 この警告は、構文は有効だが疑わしいと思われる状況で表示されます。 この例は、リスト内の2つのタプルの間にコンマがない場合です。 これは、3.8より前のPythonバージョンでは有効な構文ですが、タプルが呼び出し可能でないため、コードは `+ 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の無効な構文の一般的な例と、それらの問題の解決策についても確認しました。 これによりワークフローが高速化されるだけでなく、コードレビュアーがさらに便利になります。
コードを書くときは、Python構文を理解してフィードバックを提供するhttps://realpython.com/python-ides-code-editors-guide/[IDE]を使用してみてください。 このチュートリアルの無効なPythonコード例の多くを適切なIDEに入れた場合、コードを実行する前に問題行を強調表示する必要があります。
Pythonの学習中に + SyntaxError +
を取得するとイライラする可能性がありますが、トレースバックメッセージを理解する方法と、Pythonでどのような形式の無効な構文に遭遇するかがわかりました。 次回「+ SyntaxError +」が発生したときは、問題を迅速に修正するための準備が整います。