
Python 3系の機能を2系に導入する「Python 2.8」が議論される 17
ストーリー by hylom
延命の是非 部門より
延命の是非 部門より
あるAnonymous Coward 曰く、
マイナビニュースによると、「Python 2.8」が議論されているらしい。
あちらでは「Python 2.8:+1」として議論されているようなので、こっちは/.J +1意見交換を日本語でやらないか?
Pythonには後方互換性を保ちながらメンテナンスされている2.x系と、後方互換性を廃して新機能を導入した3.x系がある。2.x系は2.7が最新リリースとなっているが、新たに3.x系の新機能を後方互換性を保ちながら2.x系に導入してはどうか、という話だそうだ。
1つのスクリプトが両方で動くように…… (スコア:2)
私もおおよそPython 3.x系へ移行済みなんですが、それでも自分の書いたスクリプトを3.xのインストールされていない環境で実行したいときもあり、3.x用→2.x用へスクリプトを書き直す羽目になってしまいます(^^;)
そうしたときは、インタプリタやライブラリ側に大きく手を加えることなく、1つのスクリプトが両方で動くように対処できないものかな、と感じることも。
あまり良いやり方ではないのは承知の上ですが、C言語の#ifdefみたいに条件付きの中間言語コンパイルってのは駄目ですかね?
例えば、
みたいに。(超泥臭いのは認めます(^^;))
Re:1つのスクリプトが両方で動くように…… (スコア:2)
$HTTP_POST_VARSを使うのか$_POSTを使うのかなどで。
if(PHP_VERSION < '4.1.0'){
// $HTTP_POST_VARS使う処理
}else{
// $_POST使う処理
}
スクリプトですからコンパイルはうけいれられないような気もします。(評価されない限りエラーにならないから困るっていうのはわかります。)
python初心者の私としては 2.x系のサンプルばっかりの中、3.x系でやろうとするといろいろ躓くんで、過去にサポートされてたものは他と違うエラー出て欲しいです。
(今はこっちつかってねみたいな。)
.NETだとコンパイル時に使われなくなったものは「xxxは古い形式です。yyyに置き換えられました。」っていうのが出るおかげで、直すときにそんなに困りません。あとバージョンアップでいきなり使えなくなるのは今のところ経験してません。大抵「使える→警告(将来使えなくなる可能性があります)でる→エラー」という3段階ですね。エラーでも「xxxは古い形式・・」は出ます。
phpも危険な関数はワーニング出るようになったりした気がします。
3.x系で使えるかを判断してくれるツールが別途あったような気がしますが、スクリプトエンジン側でどうすればいいかある程度見せてくれた方が初学者にはありがたいし、(3.x系しかしらない)新規参入者を取り込めればいつの間にか3.x系が主流になると思うのですが。
# 結局私もWebにサンプル多い2.x系先にみとくかってことにしましたし。
# yes, fly. no, fry.
Re:1つのスクリプトが両方で動くように…… (スコア:1)
いや、Pythonの場合、スクリプトはメモリ内で一旦中間言語へコンパイルされ、その後に中間言語インタプリタが走ります。
なので、読み込んだ時点で3.xの文法エラーになるばやい(特にUNICODE文字列系)、スクリプトが1行も実行されることなく終わってしまうという……。
3.xは相当ドラスティックな変更ですからねー。
そもそも旧コードがコンパイルできなかったり、元のライブラリが整理・消滅したりしているので、警告を出すのは負荷が大きいんじゃないでしょうか。
移行ツール2to3は重いですし、結構取りこぼしもあったような(^^;)
Re:1つのスクリプトが両方で動くように…… (スコア:1)
そうなんですね、勉強になります。
それであれば中間言語コンパイラで無視してもらえればサイズも減るし理想的ですね。
そのようですね、私も勉強がてらlis.pyというプログラムを3.xで動かしてみようとしたらエラーとなり(2.7で動きました)、ならばと3.xに移植しようとしたんですが、思ってたよりもよく使われる機能が改訂されていたりして、2.xも知らない私には敷居が高かったです。
http://www.aoky.net/articles/peter_norvig/lispy.htm [aoky.net] lis.py 邦訳
.NETの場合はクラスやメソッド側に古いクラスであることとかエラーにするか警告止まりかを属性としてマークできるのですがそういった仕組みがないと難しいですよね。
# yes, fly. no, fry.
Re:1つのスクリプトが両方で動くように…… (スコア:2)
3に2のエミュレータつけるのが一番マシな解決法だと思うなぁ。。。
mymodule = py2import("py2_mymodule")
みたいなこと、できないのかなぁ。
1を聞いて0を知れ!
Re:1つのスクリプトが両方で動くように…… (スコア:1)
そんなことすると過去の遺物を今後もずっと引きずらないといけないので、Pythonとしての本来のメリットがなくなってしまうのですよ
なので2.8の話もなかったことにして2.x系は今のままで終わり、あとは3以降にお任せが一番ベストな流れだと思いますよ
# とはいえ3.x系は慣れないため未だに2.x系のコーディングで書いてますがね…
# 標準ライブラリのHTTPServer周りをもっと作り込んで貰いたいところです…
Re:1つのスクリプトが両方で動くように…… (スコア:1)
それは分かるのですが
http://python3wos.appspot.com/ [appspot.com]
を見ていると、3.xへの完全移行はなかなか先が長そうです。
その間にも、3.x非対応ライブラリを使うために2.xの新規コードがかかれるであろうことを考えると
2.xライブラリをしばらくは使いまわせないものかと……
1を聞いて0を知れ!
Re: (スコア:0)
Pythonでも、次のような書き方ならできる。
Re:1つのスクリプトが両方で動くように…… (スコア:2)
あー、ごめんなさい。上の例だとコンパイル自体は通っちゃうので問題点がはっきりしないですね。
例えば、2.x系特有の文法を使っていて3.xではそもそも文法エラーになってしまう場合、普通のifでは解決しようがないんじゃないかと。
UNICODE文字列なんかがそうです。
これだと、3.xインタプリタは"message = U'Hello, World!'"のところでSyntaxErrorを起こしてしまいます。
中間言語へコンパイルする前段階で分岐するようにしないと無理なんじゃないかと思うのです。
でも、下手にコンパイル前に分岐すると、今度はpycの互換性に難が生じるような気もします(^^;)
やっぱりこの方式は無理かな……。
Re: (スコア:0)
try:
import SimpleHTTPServer
def HTTPServer():
SimpleHTTPServer.test()
except ImportError:
import http.server
def HTTPServer():
http.server.test(http.server.SimpleHTTPRequestHandler)
HTTPServer()
ならバージョンと関係なくモジュールの有無で動く
Re: (スコア:0)
いやま、そりゃそうなんですが、ここまでくると、別々に書くのと何が違うのかっつーと....
PEP 404 -- Python 2.8 Un-release Schedule (スコア:2)
http://www.python.org/dev/peps/pep-0404/ [python.org]
Abstract
This document describes the un-development and un-release schedule for Python 2.8.
出さないらしいです。
# 404 Not Found と番号が同じなのは偶然?
# PEPの番号付けって連番ではなさそうだが、何で決めてるんだろ。
1を聞いて0を知れ!
やりたい人はやればいい (スコア:1)
3.x系に移行した私が言うことは別に何もないかなぁっていうのが印象。
移行に様々な障害があってできなかったけど、
最新の言語機能は使えたら便利だよねっていうのは至極当然な話であって、
そりゃ是非やるべきだとも思う。
ただ、心配なのは開発が進んだときに、
3.x系にちゃんと還元されるのかなぁという。
Re:やりたい人はやればいい (スコア:3, 参考になる)
気が付くと、現行の「2系と3系の二本立て」が「2系と2+1系と3系の三本立て」になってしまった、というオチだけは勘弁。
Re:やりたい人はやればいい (スコア:1)
-- 哀れな日本人専用(sorry Japanese only) --
別に移植が進まなくてもいいんじゃないか) (スコア:1)
Pだけ脊髄 (スコア:0)
PS3系の機能をPS2系に導入~
に見えた orz