モチベーション
- Python3.8で利用可能となったセイウチ演算子(:=)を使ってみたい
- Catalina出たしPython環境をアップデートしたい
インストール
先に結論
これだけでうまくいきました。
私の環境はanyenv x pyenvでPythonを管理しているため、python-build
のディレクトリパスは適宜読み替えていただければと。
$ cd ~/.anyenv/envs/pyenv/plugins/python-build && git pull origin
$ pyenv install 3.8.0
以下、試行錯誤の備忘録として。
pyenvで3.8-devのインストールを試みるもエラー
$ pyenv install 3.8-dev
・・・
Inspect or clean up the working tree at /var/folders/pv/nt2zdh7d0bzf2jlwn0zqgpnw0000gn/T/python-build.20191020002826.40064
Results logged to /var/folders/pv/xxx/T/python-build.20191020xxx.xxx.log
とあったのでログを見ると、以下のあたりが怪しい。
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/tk.h:78:11: fatal error: 'X11/Xlib.h' file not found # include <X11/Xlib.h>
^~~~~~~~~~~~
1 error generated.
xquartzをインストールしてみた
$ brew cask install xquartz
これで再実行したところ↑のエラーは消えたものの、やはりインストール自体は失敗してしまう。
CFLAGSを足して実行してみた
ビルド時にCのヘッダがうまく読み込めてないのかな?と思い、以下実行。
$ CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install 3.8-dev
これもだめ。
pyenvが古いらしい。。。
エラーをよく見ると、こちらのwikiを見ろ、と。
https://github.com/pyenv/pyenv/wiki/Common-build-problems
そして、私のpyenvがそもそも古かったようなのでpython-buildをUpdate
私の場合、anyenvを使ってpyenvを管理しているため、以下のディレクトリにpython-buildプラグインが入っています。
$ cd ~/.anyenv/envs/pyenv/plugins/python-build && git pull origin
するとちゃんと3.8.0がリストに入ってきてた。。。(まだ3.8-devしか無いのかと完全に勘違いしていたという)
$ pyenv install -l
・・・
3.7.1
3.7.2
3.7.3
3.7.4
3.7.5
3.7.5rc1
3.8.0
3.8-dev
3.9-dev
・・・
$ pyenv install 3.8.0
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.8.0.tar.xz...
-> https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tar.xz
Installing Python-3.8.0...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.8.0 to /Users/xxx/.anyenv/envs/pyenv/versions/3.8.0
と、いう対処方法がこのあたりに書かれていました。
https://github.com/pyenv/pyenv/wiki/Common-build-problems#python-build-definition-not-found
なるほどー
セイウチ演算子を試す
早速試してみる
pyenvで利用するデフォルトのPythonを3.8.0に変更。
これまで3.6.6を利用していたので随分すっ飛ばしている。
$ pyenv global 3.8.0
$ pyenv versions
system
3.6.6
* 3.8.0 (set by /Users/xxx/.anyenv/envs/pyenv/version)
セイウチ演算子(:=)を使ってみる
変数を定義しつつ、変数に与えられた値をそのまま利用できる、ということで、試しにやってみた。
与えられた2つの引数を加算する関数add
を無名関数で定義しつつ、引数に2, 3
を与えてみる。
(add := lambda x, y: x + y)(2, 3)
以下、実行結果。
$ python
Python 3.8.0 (default, Oct 20 2019, 01:28:34)
[Clang 11.0.0 (clang-1100.0.33.8)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
# セイウチ演算子を使って関数を定義しつつ実行
>>> (add := lambda x, y: x + y)(2, 3)
5
# 変数を確認すると、確かに関数が設定されている
>>> add
<function <lambda> at 0x1067c7dc0>
# 変数名から関数を呼び出してみる
>>> add(2, 10)
12
なにこれ便利。