EDIT:申し訳ありませんが、私はそれを考え出しました。(私が望むものは100%ではありません。それはexecfile()
の機能だ、私はそこにあったのか分からなかったとは信じられない。グローバル変数を宣言する関数をインポートする
私はこの質問をどのようにフレーズするかわかりませんでした(それが私のGoogle検索ではこれに事実上何も出てこなかった理由です)...しかし、ここに行きます。私は何をしようとしているのか簡略化したバージョンを与えるつもりです。だから私はmain.py
とextra.py
という2つのファイルがあるとしましょう。私は、コンソールでこれを実行する場合
# extra.py
def setfoo(): # sets "foo" to 5 even if it is unassigned
global foo
foo = 5
だから、非常に簡単:後者は次のようになります
>>> setfoo()
>>> foo
5
今度はmain.py
にかけて引き返すてみましょう。私はextra.py
からすべてをインポートimport文に設定されます:
# main.py
from extra import *
setfoo()
print foo
すべてが最後の行まで正常に動作しますが、ただし、がfoo
にアクセスしようとすると、foo
が実際にはファイルextra.py
の下に格納されているため、認識できません。 setfoo()
を実行した後にすべてをインポートすると、foo
がインポートされ、すべて正常に動作します。これと同じように:私はfrom...import
の文の代わりに標準import
ステートメントを使用している場合代わり
# main.py
from extra import *
setfoo()
from extra import *
print foo
、extra.py
からのデータに直接アクセスではなく、コピーされていることから、すべてのものを再インポートする必要はありません。
# main.py
import extra
extra.setfoo()
print extra.foo
しかし、私は本当にextra.setfoo()
私はsetfoo()
を実行するたびに出て入力する必要がありますする必要はありません、また私はextra.py
私は言った機能を使用するたびに再インポートしますか:これも動作します。私はこれに回避策があるかどうかを知りたい。理想的には、元のバージョンmain.py
で設定したコードが正しく動作するように、extra.py
を変更する方法があります。 (EDIT:複数の人がこれを誤解しているようです - extra.py
を変更したいと思っています.というコードを変更したくありません。私もextra.py
(私はPHPのinclude
とrequire
ステートメントに似たものを考えていますが、インポートされたコードはそのままコピーされ、ファイルに貼り付けられます)をインポートする別の方法を使用することを検討しますが、この変更されたimport文はまだ1行のコードに過ぎず、それほど時間はかかりません。言い換えれば、ファイル処理とexec
ステートメントを使用することは、おそらくこの目的にはあまり便利ではないでしょう。
execステートメントといえば、私が使用しているコーディング方法がどれほど悪いかは大変気にしません。このextra.py
ファイルの実際のバージョンは、今から私のプロジェクトのほとんどすべてで使用する予定なので、実際にはこれを動作させるにはちょうど良い方法が必要です。余分なスペースを取らずにこのファイルをインポートするたびに私のコード。どんな助けもありがとう。
編集:これを読んでいる人の多くは、私が達成しようとしていることについてはっきりしていないようです。実際のコードはここにあります。これは、「インライン変数の割り当て」を実現するためのシンタックスハックです。
class use_obj(object):
def __rshift__(self, other): return other
def use(**kwargs):
for var in kwargs: exec 'global ' + var + '; ' + var + ' = kwargs[var]'
return use_obj()
構文は次のようになります:ここでは(あなたは別のファイルにインポートしようとしていない場合は正常に動作します)のコードである
print use(x = 5, y = 8) >> str(x) + " times " + str(y) + " equals " + str(x*y)
コード自体は、かなり粗さが、私はインライン変数代入を実行する方法を常に望んでいました。インラインif文、リスト内包表記、lambda + reduce()
などの理由があります。なぜなら、単に割り当てられた変数を返すことができない理由は、use(x = 5, y = 8)
式(文ではありません)は、私がを使ってコードに押し込む奇妙なオブジェクトを返します0の演算子とuse()
関数が魔法のように返された奇妙なオブジェクトは、私が__rshift__()
関数を設定する方法によって消えます。
私はそれがこのように見えるとしたら、コードはその美しさと目新しさの多くを失うことになると思う:
print use(x = 5, y = 8) >> str(extras.x) + " times " + str(extras.y) + " equals " + str(extras.x*extras.y)
'extra.py'の初期化中にあなたが' foo'を設定していない何らかの理由がありますか?そうでなければ、 'foo = None'を設定することができます。 –
私が言ったように、これは私が実際にやろうとしていることの単純化されたバージョンです。関数の実際のバージョンは、この変数が 'foo'を設定する方法で複数の変数を設定し、どの変数を設定するのかわからないです。それは窓の外です。 –