パスワードを忘れた? アカウント作成
1044619 story
Python

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系に導入してはどうか、という話だそうだ。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • 私もおおよそPython 3.x系へ移行済みなんですが、それでも自分の書いたスクリプトを3.xのインストールされていない環境で実行したいときもあり、3.x用→2.x用へスクリプトを書き直す羽目になってしまいます(^^;)
    そうしたときは、インタプリタやライブラリ側に大きく手を加えることなく、1つのスクリプトが両方で動くように対処できないものかな、と感じることも。

    あまり良いやり方ではないのは承知の上ですが、C言語の#ifdefみたいに条件付きの中間言語コンパイルってのは駄目ですかね?
    例えば、

    #if __PYTHON_VERSION__ < 3
     
    import SimpleHTTPServer
    def HTTPServer():
        SimpleHTTPServer.test()
     
    #else
     
    import http.server
    def HTTPServer():
        http.server.test(http.server.SimpleHTTPRequestHandler)
     
    #endif
     
    HTTPServer()

    みたいに。(超泥臭いのは認めます(^^;))

    • かなり昔にphpでそんな感じに書いたことあります。

      $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.
      親コメント
      • スクリプトですからコンパイルはうけいれられないような気もします。(評価されない限りエラーにならないから困るっていうのはわかります。)

        いや、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の場合はクラスやメソッド側に古いクラスであることとかエラーにするか警告止まりかを属性としてマークできるのですがそういった仕組みがないと難しいですよね。

          --
          # yes, fly. no, fry.
          親コメント
    • 3に2のエミュレータつけるのが一番マシな解決法だと思うなぁ。。。
      mymodule = py2import("py2_mymodule")
      みたいなこと、できないのかなぁ。

      --
      1を聞いて0を知れ!
      親コメント
    • by Anonymous Coward

      Pythonでも、次のような書き方ならできる。

      import sys
      if 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 sys
        if sys.version_info < (3, 0):
         
            message = U'Hello, World!'
         
        else:
         
            message = 'Hello, World!'
         
        print(message)

        これだと、3.xインタプリタは"message = U'Hello, World!'"のところでSyntaxErrorを起こしてしまいます。
        中間言語へコンパイルする前段階で分岐するようにしないと無理なんじゃないかと思うのです。

        でも、下手にコンパイル前に分岐すると、今度はpycの互換性に難が生じるような気もします(^^;)
        やっぱりこの方式は無理かな……。

        親コメント
      • by Anonymous Coward

        try:
                import SimpleHTTPServer
                def HTTPServer():
                        SimpleHTTPServer.test()
        except ImportError:
                import http.server
                def HTTPServer():
                        http.server.test(http.server.SimpleHTTPRequestHandler)
        HTTPServer()

        ならバージョンと関係なくモジュールの有無で動く

        • by Anonymous Coward

          いやま、そりゃそうなんですが、ここまでくると、別々に書くのと何が違うのかっつーと....

  • 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を知れ!
  • 3.x系に移行した私が言うことは別に何もないかなぁっていうのが印象。

    移行に様々な障害があってできなかったけど、
    最新の言語機能は使えたら便利だよねっていうのは至極当然な話であって、
    そりゃ是非やるべきだとも思う。
    ただ、心配なのは開発が進んだときに、
    3.x系にちゃんと還元されるのかなぁという。

  • 個人的な経験から言うと、2.x => 3.x の移植は、確かに面倒くさいが、簡単な作業だ。 問題になるとしたら、文字列関連。 unicodeとstrがごっちゃになっているスクリプトの移植は地獄 or 不可能。 しかし、unicodeとstrが混ざっている事はそれ自体が問題であって、修正すべきな点であり、 文字列を御行儀よく扱ったスクリプトならば、2.x => 3.xも簡単に出来るはずだ。 あと、たしかに移植されないライブラリというのは存在する。 だがそういうのは、誰もわざわざ移植しようとしない、重要性が低いライブラリなのだと思う。
  • by Anonymous Coward on 2011年12月16日 12時15分 (#2067244)

    PS3系の機能をPS2系に導入~

    に見えた orz

typodupeerror

皆さんもソースを読むときに、行と行の間を読むような気持ちで見てほしい -- あるハッカー

読み込み中...