PYTHONWARNDEFAULTENCODINGを使おう

methane.hatenablog.jp

この記事で紹介した、 open() などでエンコーディングを指定せずに暗黙でデフォルトのエンコーディングが使われた時に EncodingWarning を発生させる機能のPEPが受理され、実装し、昨晩リリースされた Python 3.10a7 に入りました。

.bashrc などで extern PYTHONDEFAULTENCODING=1 などとしておけば、デフォルトエンコーディングを使用している箇所に警告が表示されます。自分で書いているプログラムだけでなく、利用しているツールやライブラリ、フレームワークに対する警告についても見かけたら開発元に報告してもらえると助かります。

警告を見つけた場合にどうするべきか、簡単に説明します。

UTF-8を利用している場合

MarkdownYAML、TOML、JSONを開くのに encoding 引数を指定しないのは、ほとんどの場合バグです。特定の環境で動けば良いプログラムならそのままでも大丈夫ですが、そうでない場合はWindowsでファイルに非ASCII文字が含まれているとエラーになります。 encoding="utf-8" を指定しましょう。

ロケールエンコーディングを利用している場合

Python 3.10 からは encoding="locale" を指定して Warning を解消することができますが、これをすると Python 3.9 で動かなくなります。 Python 3.9 にも対応した形でWarningを解消したい場合は encoding=locale.getpreferredencoding(False) を指定することができますが、そのまま放置しても問題ないでしょう。

将来的にデフォルトのエンコーディングUTF-8に切り替わった場合に動かなくなりますが、近い将来に切り替わる予定はありません。数年後に Python 3.9 のサポートを切ってから encoding="locale" を指定しましょう。

パターンマッチングがAcceptされました

Mailman 3 [python-committers] Acceptance of Pattern Matching PEPs 634, 635, 636, Rejection of PEPs 640 and 642 - python-committers - python.org

パターンマッチング構文が複数提案されていたのですが、 PEP 634, 635, 636 が Accept されました。順調にいけば今年リリース予定のPython 3.10に搭載されるでしょう。

大きい提案なのでPEPが3つに分けられています。

興味がある人はチュートリアルだけ読めば使い方がわかるようになっています。

PythonのデフォルトエンコーディングをUTF-8にするために

Python がテキストファイルを開く時のデフォルトエンコーディングUTF-8でないことは、多くのWindowsユーザー、特にプログラミング初心者にとって障害になっています。

UnicodeDecodeError で検索すると、多くのWindowsユーザーが問題に遭遇しているのがわかります。

エラーの内容を見てみると、次のようなケースが多いようです。

  • JSONなどのUTF-8で書かれたテキストファイルを開こうとして UnicodeDecodeError が発生する
  • Webから取得したテキストデータなどを保存しようとして UnicodeEncodeError が発生する
  • pip install しようとしたパッケージが setup.py の中で、UTF-8で書かれた README.md や LICENSE ファイルを読んでいる

これらのエラーは、Pythonがデフォルトで利用するエンコーディングUTF-8にすると解決します。

しかし、これは後方互換性を失う変更になります。後方互換性のためのオプションを残しつつ変更しようという提案をしたことがあるのですが、Microsoft所属のコミッターであるSteve Dower氏から強い反対を受けました。数年間、 encoding= を指定していない全ての open() などの呼び出しに、デフォルトが変わるというWarningを発生させるべきだと言うのです。

Warningに対する反対意見もあります。ほとんどの encoding= 指定がない open() は、ASCIIのみのファイルを開いていたり、クラスプラットフォームの必要がないケースだったりです。DeprecationWarningならほとんどの場合デフォルトで表示されないのですが、それでもDeprecationWarningが大量発生すると他のDeprecationWarningが巻き添えで無視されるケースが出てくるので良くありません。

Warningを出すべきという意見と嫌だと言う両方の意見の板挟みになり、このままでは前に進めません。どうしたら良いでしょうか?

戦略1: opt-in な Warning

大きな問題は、DeprecationWarningを出すのがどれくらいウザいのかです。そこで opt-in でEncodingWarningを出す提案PEP 597を出しています。だいぶ話がまとまってきたので早ければ今週中にもSteering Councilに提出しようと思っています。

このオプションを有効にして、標準ライブラリやpipのような誰もが使うツールから不適切な encoding= の省略を潰していけば、いつかはこのWarningをデフォルトで出せるようになるかもしれません。うまくいけばその数年後にデフォルトのエンコーディングを変更できるでしょう。

しかし、この戦略には大きな欠点があります。デフォルトのエンコーディングを変更できるのがいつになるかわかりません。少なくとも5年以上は先になるでしょう。2030年に間に合わないかもしれません。

Windows上でPythonを使う多くの新しいユーザーを、5年以上もこの不幸な状況に留めておくのは良くありません。もっと素早い解決方法が必要です。

戦略2: UTF-8 mode を普及させる

UTF-8 mode を使うと最初に紹介した問題を解決することができます。ですが UTF-8 mode はまだあまり知られていません。

UTF-8 modeを有効にするには -Xutf8 オプションか PYTHONUTF8 環境変数を利用する必要があり、これは特にコマンドラインを普段使わないようなユーザーにとっては高いハードルになります。インストーラーやスタートメニューに登録される小さいツールなどで設定できるようユーザー環境変数を設定することができますが、それでも既存の Python を使ったアプリを壊してしまう懸念があり、そう簡単に誰にでもおすすめできるものではありません。

この問題を解決するために、環境(インストールや仮想環境)ごとにUTF-8 modeを有効にできる設定ファイルを追加しようというアイデアを現在 Python-ideas MLで提案しています。

まだ具体的なアイデアは固まっていませんが、例えば python.exe と同じディレクトリに python.ini ファイルを置き、その中に utf8mode=1 という行があればUTF-8 modeを有効にするというものです。

Pythonをインストールするときや仮想環境を作る時にUTF-8 modeを有効にするか選べるようにすれば、例えば授業で生徒にPython環境をセットアップしてもらうときにUTF-8 modeを有効にしてもらうことができるでしょう。

もう少し野心的な事を話すと、UTF-8 modeを有効にすることがWindows上でのPython環境のベストプラクティスと認識されるようになったら、インストーラーでこのオプションにデフォルトでチェックを入れることができるかもしれません。そうなれば、新しいユーザーにとっては実質的にUTF-8 modeがデフォルトになります。

初心者向けに Python の環境構築記事を書かれる方は、ぜひ UTF-8 mode を紹介する事を検討してみてください。

easy_install が消えた

ずっと前から deprecated になっていた easy_install コマンドが、setuptools53でとうとう消えました。

今後リリースされる Python にはこのバージョン以降の setuptools がバンドルされ、Python をインストールした時に bin/ ディレクトリに入るゴミが1つ減るはずです。 めでたしめでたし。

2050年再エネ100%はどれくらい難しいか(2) - 発電所の規模について

昨日は2050年の年間消費電力量が1300~1500TWhになること、現在より増える理由は、人口減や省エネで減る電力消費よりも電化で増える消費電力が多いからだということを紹介しました。

methane.hatenablog.jp

今回はこれだけの電力量を発電するのに、太陽光、陸上風力、洋上風力それぞれどれくらいの発電所が必要なのかをざっくりと計算していきます。1つの電源で全ての電力を賄う訳ではないので、とりあえずどの発電方式も500TWh発電するのに必要な規模を計算します。3つ全てが500TWhを発電する必要はないし多分不可能でしょうが、最低1つの電源は500TWhを超える電力を発電してもらわなければなりません。

設備利用率について

発電所が年間を通して100%定格出力で発電できた場合、発電量は出力 (kW)×24×365になります。1GWの発電所の場合8760GWhを発電することになります。

実際にはそんなことはありえなくて、点検が必要だったり、地震で止まったり、発電量を需要に合わせるために定格以下の出力で発電することもあります。なので 平均的な年間発電量/(定格出力×24×365)のことを設備利用率と言います。

太陽光発電は夕方には発電量が落ち、夜はゼロになります。曇りの日もかなり出力が低下します。そのため太陽光発電の設備利用率は12%程度と言われています。風の強さで発電量が変わる風力も陸上で20%、洋上で30%と言われています。今回はこの数字を使って計算します。

よく新聞記事で発電所の規模を「原発○基分」という表現が使われますが、これは1GWを1基分としていることが多いです。発電量で考えた場合、(3.11前の設備利用率80%の)原発に比べると、4GWの陸上風力発電(設備利用率20%)は「原発4基分」ではなく「原発1基分」になります。

太陽光発電

設備利用率12%というのはすごく計算が楽で、24×365×0.12=1051.2なので、出力に1000をかければ年間発電量になります。1MWの発電所なら1GWhですね。今回は年間発電量500TWhを発電する場合に必要な規模を見積もるのですから500GWです。

だいたい1MWの太陽光発電所に必要な面積が1haと言われているので、500GWなら50万ha=5000平方kmです。琵琶湖が670平方kmなので、おおよそ琵琶湖7.5こ分の面積をソーラーで埋め尽くせば2050年の日本の電力需要の1/3 (500TWh) をまかなえることになります。

これだけの面積をどうやって日本から見つければいいのでしょうか?現在考えられているのが耕作放棄農地の転用と、農地での発電(ソーラーシェアリング)です。農地に関する統計によると、440万ha、荒廃農地が28万haあります。

農地に関する統計:農林水産省

ここからは私個人の予想(想像)になります。

日本は個人の財産、土地所有が憲法に守られているので、国が強制的に「この土地でソーラー発電しろ」とは言えません。ですが地方自治体、地主、農家、発電事業者が積極的に協力できれば、いいところ(100GW以上)までは行けそうです。

一方で、ソーラーの発電量が多い時間帯(晴れの日の10:00~14:00)は電力市場のスポット価格も低下しがちです。ソーラー発電の割合が増えれば増えるほどこの動きは顕著になり、発電量あたりの発電収入は下がってしまいます。指数関数的な導入量増大を実現できたとしても、500GWに到達する前に失速してしまうかもしれません。

JPEA(太陽光発電協会)の意見表明でも、2050年に300GWがビジョンとして示されています。

自由民主党再生可能エネルギー普及拡大議員連盟における意見表明について

陸上風力

設備利用率20%とすると、500000 × 5 ➗ (24×365) = 285 なので、年間発電量500TWhのためには約300GWが目標になります。

風車は大型にした方が効率がいいのですが、陸上だとあまりに巨大な風車は建設が大変なので、あまり大型化が進まず大型風車でも2MW程度が主流だと仮定すると、300,000MW / 2MW = 15万本の風車が必要になります。

300GWを30年間で実現するには毎年10GWの導入が必要です。とはいえいきなり来年から10GWをというのは無理です。今まで風力をほとんど育てていなかった日本はこれから産業を育成していかないといけません。2040年代のピークには年間30GW以上導入する年が必要になりそうです。

さて、ドイツでは2014年に4.7GWの風力を導入していたものの、2019年には1GWに減速しています。理由の一つに近隣住民とのトラブルが挙げられています。風車自体は太陽光よりも面積を使わないものの、低周波騒音を考えると住宅地の近くにはあまり建設できません。

https://eneken.ieej.or.jp/data/5945.pdf

www.fepc.or.jp

日本の場合を考えると、圧倒的に多くの導入ポテンシャルが北海道にあります。2050年まで減速せずに風力発電の導入量を指数関数的に伸ばしていくには、北海道の土地利用計画や送電線の整備が重要になってくると思います。

しかし、JWPA(日本風力発電協会)のビジョンでは、2050年の陸上風力導入量は40GW以下で、最近の報道を見ても洋上風力が過熱していて陸上風力のニュースは少ないです。

jwpa.cloud

北海道に大量に陸上風力を作っても結局関東まで電気を送るには長距離大容量送電線が必要になるから、洋上風力に比べて需要地の近くで発電できる陸上風力のメリットが活きないとか、陸上風力ではEUの方が進みすぎていて国内企業が競争しにくいとか、いろいろな理由があるのだと思いますが、今の流れでは2050年までに300GWはかなり難しそうです。

洋上風力

設備利用率30%とすると、500000 × 10 / 3 / (24×365) = 190 なので、年間発電量500TWhのためには約190GWが目標になります。まず設備利用率の段階で陸上風力よりも有利です。

洋上風力は大型化にも有利で、最近だと1基あたり12MWのものがあります。ここで大型化が止まったとしても、190000/12≒15800で、同じ電力量を発電するのに必要な数が陸上に比べて1割強で済みます。

ポテンシャルも日本の電力全てをまかなえるだけあり、全く問題ありません。唯一の問題は、日本には浅い海が少なく、低コストな着床式は沿岸にしか置けないことです。遠くにおける浮体式はまだコスト競争力がありません。

逆に見ると、陸上風力、着床式風力で圧倒的に先行しているEUに対して、日本が追いつき追い越すチャンスが残っているという事でもあります。これが最近洋上風力に関するニュースが過熱している理由だと思います。

JWPAのビジョンでは、2050年ではなく2040年で45GWになっており、政府もこの目標を採用する流れになっています。陸上風力や太陽光が発電量500TWhが難しい分、洋上風力は2050年に190GWどころか400GWくらい欲しいところですが、どこまで行けるかは未知数です。

まとめ

ポテンシャルは十分にあるので、業界が毎年成長し続けられるように環境を整えれば2050年に再エネ100%は不可能とは言えません。

一方で、JPEAとJPWAのビジョンを元に見積もると、JPWAは2050年の洋上風力を出していないので勝手に45GWの3倍の135GWとして355TWh、陸上風力は30GWとして53TWh、太陽光は300GWとして300TWh、合計で708TWhしかなく、1.3~1.5PWhの46%~54%しかありません。その他の再エネ(主に水力)は10%程度として、政府の2050年に再エネ50~60%とほぼ合致します。

ビジョンからの(特に風力の)上積みに期待しつつも、ビジョンを最低ラインとして必ず実現することに加え、その時に足りなくなる40~50%の電力をCO2フリーな輸入燃料(グリーン水素やアンモニア)で発電する準備も必要です。それにも国内外で10年以上かけた大規模なインフラ整備が必要になるので、2050年に再エネ50~60%という夢のない目安を安直に少なすぎると批判することもできません。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。