座敷牢日誌

都落ちした元SEがソフトウェアやネット関連のことを書いています

Python2.7でprint関数は (通常は) 使えません

Python3で print は関数として振る舞うようになってるが、Python2.7 では print 文として実装されている。が、関数としても存在する。

# これらはどっちも有効
print 'hello'
print('hello')

Python2.7で関数として print を使おうとしたときに、構文エラーが返されることがあっ た。

# print文の代替のように使う分には問題ない
print "test"
print("test")

# 関数固有の使い方はアウト? これらはどっちも構文エラーが返される
p = print
f = lambda s: print(s)

リファレンスに解説があった。

2. 組み込み関数 - Python 2.7ja1 documentation

この関数は print という名前が print ステートメントとして解釈されるため、通常は 使用できません。ステートメントを無効化して、 print() 関数を使うためには、以下 の future ステートメントをモジュールの最初に書いて下さい。

「通常は使用できません」とまで書いてあるとは知らなかった。

リファレンスにあるとおり、__future__ モジュールから関数をインポートすると、こ の問題を回避できる。

from __future__ import print_function
f = lambda s:print(s)
f("test")

なお、インポート後はprint文が使えなくなる (構文エラー)。

あまり気にしてなかったけど、Python3っぽい書き方をPython2に混在させるのはよくない のかね。python2から3への移行のに際して、少しずつ3っぽい書き方を2でさせるようにす る……、みたいなロードマップをどこかで読んだ。なので、限られた状況においての話だ とは思うけど。

広告を非表示にする