16

仕様:Python 2.7

私はいくつかのモジュールを持つプロジェクトに取り組んでいます。それらすべての__future__モジュールからいくつかの機能をアクティブにしたいです。1つのモジュールに必要なすべての機能をインポートしてから、その1つのモジュールを他のすべてのモジュールにインポートし、それらの機能をすべてのモジュールでアクティブにするか、その効果を実現したいと思います。

私は試した:

[A.py]

from __future__ import division

[B.py]

import A
print(1/2)

B.pyを実行すると、除算はまだ整数でした。私は試した:

[A.py]

print(1/2)

[B.py]

from __future__ import division
import A

B.pyを実行しても同じ結果が得られました。前の両方の例で、「importA」を「fromA import *」に切り替えてみたところ、同じ結果になりました。

私はしばらくの間Googleを検索し、Pythonのドキュメントで__future__モジュールがどのように機能するかについての最良の説明を見つけました。そこでは、グローバルに実行する方法については何も言及せずに、インポート先のモジュールで機能がアクティブになるという保証しか見つかりませんでした。

ですから、これを行う方法があるかどうかを知りたいのですが、私が説明した方法、ある種のランタイム構成ファイルの作成、またはその他の方法のいずれかです。

4

2 に答える 2

15

これを言語で行う方法はありません。__future__この意味で、インポートをグローバルにすることはできません。(まあ、おそらく通常のimportステートメントを何か複雑なものに置き換えることができます。Futureステートメントimpのドキュメントを参照して「Codecompiledby…」までスクロールしてください。しかし、このようなものはほぼ間違いなく悪い考えです。)

その理由は、from __future__ import division実際には通常のインポートではないためです。または、むしろ、それは通常のインポート以上のものです。実際に、検査できるという名前が付けdivisionられますが、その値を指定しても効果はありません。したがって、他のモジュールに名前を渡しても、それらのモジュールには影響しません。__future__通常のインポートに加えて、Pythonには、モジュールの上部またはインタラクティブインタープリターでインポートを検出し、コードのコンパイル方法を変更する特別な魔法があります。すべての詳細が必要な場合は、「実際のインポート」部分についてはfutureを、「魔法」部分についてはFutureステートメントを参照してください

そして、これを可能にする構成ファイルはありません。ただし、コマンドラインパラメータがあります。

python -Qnew main.py

from __future__ import divisionこれは、どこでも行うのと同じ効果があります。

これを#!行に追加したり、シェルにalias pyfuturediv='python -Qnew'(またはalias python='python -Qnew')追加したりすることができます。これは、目的に応じた構成ファイルと同じくらい良いものです。

しかし、実際には、モジュールBが新しいスタイルの分割を確実に取得するようにしたい場合は、最初にBで宣言を行う必要があります。__future__

または、もちろん、2.3-2.7の代わりにPython3.0+用に書くこともできます。(コア開発者の中には、コマンドライン引数を持つことに反対している人もいることに注意してください。「機能Xをグローバルに取得する正しい方法は、Pythonのバージョン>=機能XのMandatoryReleaseを使用//することです」 //

もう1つの可能性は、Python 3.3に近いコードを記述し、2.4-2.7(および3.0-3.2)で正しく動作させるように設計されたモジュールである6を使用することです。たとえば、print関数は取得できませんが、print_まったく同じように機能する関数は取得できます。Unicodeリテラルは取得できませんが、u()偽のリテラルを取得できます。これは、ソースでのUTF-8エンコーディング宣言と合わせて、ほぼ十分です。__future__また、 <code> StringIOやBytesIOexec関数としての関数など、取得できないものもたくさんありますnext

1000個のソースファイルがあり、それらをすべて編集するのが面倒な場合は、を使用するか、除算を修正するオプションだけを sed使用するか、または…</ p>3to2

于 2012-12-08T02:38:43.543 に答える
3

別のアプローチは、isortを使用することです。指定したファイルにインポートを追加するisortためのコマンドラインフラグがあります。-a引数なしで実行するだけisortで、現在の作業ディレクトリとすべてのサブディレクトリにあるすべてのPythonファイルで再帰的に実行されます。

私のように、そのフォルダー内に仮想環境があり、gitを使用していて(またはファイルのみを一覧表示する同等の方法がある)、その仮想環境内のすべてのファイルで実行したくない場合は、何かを使用できますお気に入り:

git ls-tree -r HEAD --name-only | grep "\.py$" | xargs isort -a -y "from __future__ import division"

于 2016-09-15T17:32:24.177 に答える