web-dev-qa-db-ja.com

'#-*-coding:utf-8-*-'もPythonのコメントですか?

Pythonにコメントを挿入するために#を使用するとき、Pythonはどのようになりますか:

# -*- coding: utf-8 -*-

違う?

50
Shravil Potdar

はい、コメントでもあります。 Andファイルの先頭の最初の2行にある場合、そのコメントの内容は特別な意味を持ちます。

エンコーディング宣言ドキュメント から:

Pythonスクリプトの1行目または2行目のコメントが正規表現coding[=:]\s*([-\w.]+)と一致する場合、このコメントはエンコード宣言として処理されます。この式の最初のグループは、ソースコードファイルのエンコーディングを指定します。エンコーディング宣言は、それ自身の行に現れなければなりません。 2行目である場合、最初の行もコメント専用行である必要があります。

コメントに関する限り、ファイルの読み取りにどのコーデックを使用するかは重要ではありません。 Pythonは通常、#トークンの後のeverythingを無視し、受け入れられたすべてのソースコードコーデックで#、エンコード宣言および行区切り文字は、すべてASCIIのスーパーセットであるため、まったく同じようにエンコードされます。したがって、パーサーが行う必要があるのは、1行読み取り、コメント内の特別なテキストをスキャンし、必要に応じて別のテキストを読み取り、コメントをスキャンし、指定されたコーデックに従ってデータを読み取るようにパーサーを構成することです。

コメントがファイルの1行目または2行目である必要がある場合(2行目である場合、1行目もコメントである必要があります)、これは完全に安全です。設定されたコーデックは、とにかく非コメント行。

50
Martijn Pieters

Pythonリファレンスマニュアルの エンコード宣言 を参照してください。

commentPythonスクリプトの[1行目または2行目が正規表現coding[=:]\s*([-\w.]+)、このcommentはエンコード宣言として処理されます。この式の最初のグループは、ソースコードファイルのエンコーディングを指定します。

(エンファシス鉱山)

そう、それは特別なコメントです。パーサーは、1行目または2行目以外のコメントの場合と同様に、パーサーがそれを試行し、無視しないという点で特別です。たとえば、サンプルファイルdecl.pyの未登録のエンコーディング宣言を考えてみましょう。

# # -*- coding: unknown-encoding -*-
print("foo")

これを試して実行すると、Pythonはそれを試して処理し、失敗して文句を言います。

python decl.py 
  File "decl.py", line 1
SyntaxError: encoding problem: unknown-encoding