3

ファイルを作成して時間を計算するための小さなPythonスクリプトを作成しました。Fedora10とUbuntu8.xでテストしましたが、うまく機能しました。Pythonのバージョンは2.5.xでした。

本番サーバー(古いRed HatベースのLinuxサーバー)で実行しようとしましたが、Pythonのバージョンは2.2.3です。スクリプトが機能せず、クラス定義で構文エラーが発生します。

スクリプトは、ディスク上にファイルを作成し、時間を測定し、ディスクの書き込み速度を推定するメソッドを備えたクラスを定義します。それはこのように始まります:

class TestDiskSpeed():
    def __init__(self, rounds=1, speedMode=SPEED_MODE_MEGABYTE):

クラス定義は、Python2.2.3によってエラーとして指摘されています。

アプリケーションをクラッシュさせる可能性のある2.2.3以降のPythonの主な変更点は何ですか?私はこれらのモジュールを使用しています:os、sys、time、stat、gc。

アップデート:

()クラス定義から削除することにより、 Pythonはクラスを受け入れました。しかし、この行で別のエラーが発生します。

size = long(size) if size != None else self._size

私はPHP開発者であり、Pythonプログラミング(おそらく1か月)に入ったばかりで、次のようにPHPで行われる三項演算に非常に慣れています。

$var = (condition) ? $valueIfTrue : $valueIfFalse;

検索したところ、size変数に使用したものと同じようにPythonで実行されていることがわかりました。Python2.2.3はそれを好まないようですが。

ここにすべてのコードを挿入するつもりでしたが(とにかくスクリプトをLGPLとしてリリースする予定です)、コードは150行を超えています(まだ開発中です)。

4

5 に答える 5

8

私はこの正確な質問に答えるのを助けるために少し前にスクリプトを書きました:pyqver

このスクリプトは、特定のソースファイルを実行するために必要なPythonの最小バージョンを識別しようとします。

配布用のPythonスクリプトを開発するときは、必要なPythonインタープリターの最小バージョンを特定することが望ましいです。pyqverは、Pythonコンパイラの出力の単純な分析を使用して、この質問に答えようとします。

このオプションを使用して-v、スクリプトに特定の最小バージョンが必要な理由をリストします。これは、スクリプトを特定のバージョンのPythonで機能させるために何を変更するかを決定するのに非常に役立ちます。

いつものように、気軽にフォークして貢献してください!

于 2009-12-01T06:53:34.663 に答える
1

()クラス定義でを削除するとコンパイルされるので、これは奇妙です。ただし、ドキュメントには、空の親は問題ないと記載されています。

多くのPython2.5機能を使用しているため、それらすべてを見つけるのは大変な作業になります。2.2から2.5までのすべてのバージョンの「Pythonの新機能」を読んでから、次のような検索可能な機能のリストを作成することをお勧めします。

  • 内包表記とジェネレータ
  • 三項式
  • デコレータ
  • 新しいスタイルのクラス

幸いなことに、ほとんどの新機能には新しい言語キーワード(または、三項の場合はキーワードの新しい使用方法)が付属しているx if p else yため、それらをgrepするのは難しいことではありません。

于 2009-12-01T06:58:22.113 に答える
1

このページは、すべてのPythonバージョンのドキュメントにリンクしています。AndrewKuchlingがリリースごとに熱心に書いている「PythonXXの新機能」ドキュメントを探してください。

手に負えないのですが、問題はクラス定義の空()にあると思いますが、2.3「What'snew」ドキュメントにこの構文の変更がリストされていません。

pyparsingモジュールの下位互換性を2.3.2に戻そうとしましたが、リスト内包表記が追加されたときであり、それ以前に戻ることはできません。サーバーをアップグレードするチャンスはありませんか?

于 2009-12-01T06:59:32.983 に答える
1

私のお金は新しいスタイルのクラスにあります。それは()あなたのクラスにあることを意味します。

于 2009-12-01T07:07:09.817 に答える
0

三項演算子はまったく新しいものです。いくつかの選択肢がありますが、私はそれを次のように書きます:

if size is None:
    size = self._size
else:
    size = long(size)
于 2009-12-01T07:55:47.567 に答える