概要
python3.6でTravisCIを使用して、テストを実行した時に謎のSyntaxErrorが発生した問題について説明します。
SyntaxErrorの発生
ローカルの環境でpython3.6
のunittest
を使用してテストコードを書いていました。
もちろんローカルでもテストを定期的に実行していました。
実行方法と実行結果は以下です。
python -Wall -m unittest discover -s aetam/tests
.....
----------------------------------------------------------------------
Ran 5 tests in 0.026s
OK
何も問題はありません。
私の思惑通りです。
ある程度区切りがついたので、コードをGitHubにPUSH!!
そうです。何も問題はなく、テストが無事通ると思っていました。
その時、まさかあんなことになるとは予想もしていませんでした。
pushしたし、次の作業に移ろうとGitHubを漁っていた時でした。
TravisCIからまさかのErrored
のメッセージが届きました......!
まさかと思い、TravisCIの管理画面を開きエラーの原因を探しました......。
エラーの記述がありました。以下です。
SyntaxError: Non-ASCII character '\xe9' in file views/login.py on line 37, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
ASCIIじゃない!!??
そりゃそうですよ!
UTF8ですからね!!
(最近はコメントにもあまり日本語を使わないようにはしてたりするんですが、プロジェクトによって日本語を使ったり、難しくて英語では説明しきれない時など限定的に使用することがあります。日本語を使うなという指摘は受け付けません!)
ここで一つ嫌な予感がしました。
まさか......、古のマジックコードを書かなければいけないとか......?
1: # -*- coding: utf-8 -*-
エラーが出たファイルの1行目に、マジックコード追加してもう一度pushして見ました。
と、通ってしまいました......。
Python2系
との互換性のためだったりするのでしょうか?
結論
現状判明している解決方法は3つあります。
- マジックコードで文字コードを明示的に指定する。
- 英語以外書かない
- 別のサービスを使用する
プロジェクトで導入するにあたり簡単な選択は1番です。
ですが私はマジックコードなど書きたくなかったので、すぐにコメントを英語に書き換えました。
なぜなら最近のスタンダードなコーディングルール的にはコーディングルールは書かないのが基本だからです。
どうにかならないものでしょうか......?