アカウント名:
パスワード:
私もおおよそPython 3.x系へ移行済みなんですが、それでも自分の書いたスクリプトを3.xのインストールされていない環境で実行したいときもあり、3.x用→2.x用へスクリプトを書き直す羽目になってしまいます(^^;)そうしたときは、インタプリタやライブラリ側に大きく手を加えることなく、1つのスクリプトが両方で動くように対処できないものかな、と感じることも。
あまり良いやり方ではないのは承知の上ですが、C言語の#ifdefみたいに条件付きの中間言語コンパイルってのは駄目ですかね?例えば、
#if __PYTHON_VERSION__ < 3 import SimpleHTTPServerdef HTTPServer(): SimpleHTTPServer.test() #else import http.serverdef HTTPServer(): http.server.test(http.server.SimpleHTTPRequestHandler) #endif HTTPServer()
みたいに。(超泥臭いのは認めます(^^;))
スクリプトですからコンパイルはうけいれられないような気もします。(評価されない限りエラーにならないから困るっていうのはわかります。)
いや、Pythonの場合、スクリプトはメモリ内で一旦中間言語へコンパイルされ、その後に中間言語インタプリタが走ります。なので、読み込んだ時点で3.xの文法エラーになるばやい(特にUNICODE文字列系)、スクリプトが1行も実行されることなく終わってしまうという……。
3.x系で使えるかを判断してくれるツールが別途あったような気がしますが、スクリプトエンジン側でどうすればいいかある程度見せてくれた方が初学者にはありがたいし、(3.x系しかしらない)新規参入者を取り込めればいつの間にか3.x系が主流になると思うのですが。
3.xは相当ドラスティックな変更ですからねー。そもそも旧コードがコンパイルできなかったり、元のライブラリが整理・消滅したりしているので、警告を出すのは負荷が大きいんじゃないでしょうか。移行ツール2to3は重いですし、結構取りこぼしもあったような(^^;)
いや、Pythonの場合、スクリプトはメモリ内で一旦中間言語へコンパイルされ、その後に中間言語インタプリタが走ります。
そうなんですね、勉強になります。それであれば中間言語コンパイラで無視してもらえればサイズも減るし理想的ですね。
3.xは相当ドラスティックな変更ですからねー。
そのようですね、私も勉強がてらlis.pyというプログラムを3.xで動かしてみようとしたらエラーとなり(2.7で動きました)、ならばと3.xに移植しようとしたんですが、思ってたよりもよく使われる機能が改訂されていたりして、2.xも知らない私には敷居が高かったです。http://www.aoky.net/articles/peter_norvig/lispy.htm [aoky.net] lis.py 邦訳
.NETの場合はクラスやメソッド側に古いクラスであることとかエラーにするか警告止まりかを属性としてマークできるのですがそういった仕組みがないと難しいですよね。
3に2のエミュレータつけるのが一番マシな解決法だと思うなぁ。。。mymodule = py2import("py2_mymodule")みたいなこと、できないのかなぁ。
そんなことすると過去の遺物を今後もずっと引きずらないといけないので、Pythonとしての本来のメリットがなくなってしまうのですよなので2.8の話もなかったことにして2.x系は今のままで終わり、あとは3以降にお任せが一番ベストな流れだと思いますよ
# とはいえ3.x系は慣れないため未だに2.x系のコーディングで書いてますがね…# 標準ライブラリのHTTPServer周りをもっと作り込んで貰いたいところです…
それは分かるのですがhttp://python3wos.appspot.com/ [appspot.com]を見ていると、3.xへの完全移行はなかなか先が長そうです。
その間にも、3.x非対応ライブラリを使うために2.xの新規コードがかかれるであろうことを考えると2.xライブラリをしばらくは使いまわせないものかと……
Pythonでも、次のような書き方ならできる。
import sysif sys.version_info < (3, 0): import SimpleHTTPServer def HTTPServer(): SimpleHTTPServer.test() else: import http.server def HTTPServer(): http.server.test(http.server.SimpleHTTPRequestHandler) HTTPServer()
あー、ごめんなさい。上の例だとコンパイル自体は通っちゃうので問題点がはっきりしないですね。例えば、2.x系特有の文法を使っていて3.xではそもそも文法エラーになってしまう場合、普通のifでは解決しようがないんじゃないかと。UNICODE文字列なんかがそうです。
import sysif sys.version_info < (3, 0): message = U'Hello, World!' else: message = 'Hello, World!' print(message)
これだと、3.xインタプリタは"message = U'Hello, World!'"のところでSyntaxErrorを起こしてしまいます。中間言語へコンパイルする前段階で分岐するようにしないと無理なんじゃないかと思うのです。
でも、下手にコンパイル前に分岐すると、今度はpycの互換性に難が生じるような気もします(^^;)やっぱりこの方式は無理かな……。
try: import SimpleHTTPServer def HTTPServer(): SimpleHTTPServer.test()except ImportError: import http.server def HTTPServer(): http.server.test(http.server.SimpleHTTPRequestHandler)HTTPServer()
ならバージョンと関係なくモジュールの有無で動く
いやま、そりゃそうなんですが、ここまでくると、別々に書くのと何が違うのかっつーと....
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
私はプログラマです。1040 formに私の職業としてそう書いています -- Ken Thompson
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)
いやま、そりゃそうなんですが、ここまでくると、別々に書くのと何が違うのかっつーと....