0

2 つのファイルに整理された 2 つの関数があります。例えば

ファイル a.py

import b

def a():
    print "a"

if __name__ == "__main__":
    b.b()

ファイル b.py

import a           # this is what I want to eliminate

def b():
    a.a()          # could I invoke a from a.py with simply a()?

インポートせずに、完全修飾名ではなく単純な名前でab.py から直接呼び出すことは可能ですか?aa()

よろしくお願いします!

4

4 に答える 4

4

これら 2 つのファイルはモジュール内にありますか? その場合、 を使用して__init__.pyから関数をインポートできますa

mymodule/ __init__.py:

    from a import afunc

mymodule/ a.py:

    def afunc(): 
        print "afunc"

そしてmymodule/でb.py:

    from mymodule import afunc
    afunc()

そうすれば、将来 の名前をa.py変更する場合は、__init__.py.

于 2013-01-16T07:43:56.690 に答える
2

いいえ、Python はどのようにしてどこにあるべきかを知るのでしょうaか? システムには何千もの Python ファイルがあり、それらのいずれかを意味する場合があります。

おっしゃる通り、コードは 2 つのファイルにまとめられています。システム全体のすべてのファイルのすべての機能を常に利用できるようにすることは、あまり整理されていません。

しかし、これを行うことができます:

# b.py
from a import a

def b():
    a()

これにより、モジュールから単一の関数が抽出されるため、モジュール名を使用して呼び出す必要はありません。

于 2013-01-16T07:33:59.260 に答える
1

インポートする必要がありますが、実行できますfrom a import a。次に、それをとして使用できますa()

于 2013-01-16T07:33:34.180 に答える
1

もしあなたが本当にこれをしたいのであれば (そしてあなたが本当にしたくないのであれば)、いつでも外部から注入することができますab

a.py:

import b

def a():
    print "a"

b.a = a

if __name__ == "__main__":
    b.b()

b.py:

"""NOTE: Before you can use this module, you must set `b.a` to a function of
   no arguments that does ____!"""

def b():
    a()

set_a代わりに関数を持つ方がおそらくきれいでしょう:

a.py:

import b

def a():
    print "a"

b.set_a(a)

if __name__ == "__main__":
    b.b()

b.py:

a = None

def set_a(func):
    a = func

def b():
    if not a:
        raise Exception('You must call b.set_a before you can call b.b!')
    a()

このバージョンのパターンは、実際に時々発生します。のユーザーがオブジェクトbについて考える必要がない場合b.Bもあるため、 のように、シングルトン オブジェクトを使用する便利な関数がありますrandom。ここで、B関数を受け取る必要がある関数 (例: ハンドラー、コールバック、代替ソケット ファクトリなど) がある場合は、おそらくb.set_a型関数を使用します。


とにかく、コメントで説明したように、正しい答えはa.py、モジュールとそれを呼び出すa.py別のスクリプトにリファクタリングすることだと思います。main.py次に、メインにb.py依存せずに依存できaます。これは、回避しようとしていたものです。

a.py:

def a():
    print "a"

b.py:

import a

def b():
    a.a()

main.py:

import b
if __name__ == '__main__':
    b.b()

素敵でシンプル。if __name__そして、実際には、この場合はビットさえ必要ありませんimport main

于 2013-01-16T07:58:34.317 に答える