0

たくさんの関数を持つ python モジュールがある場合、次のように言います。

#funcs.py
def foo() :
    print "foo!"

def bar() :
    print "bar!"

また、文字列から関数のリストを解析し、それらの関数を実行するように設計された別のモジュールがあります。

#parser.py
from funcs import *

def execute(command):
    command = command.split()
    for c in command:
        function = globals()[c]
        function()

次に、Python を開いて次の操作を行います。

>>> import parser
>>> parser.execute("foo bar bar foo")
foo!
bar!
bar!
foo!

funcs.py関数のリストを関数自体として呼び出すことができる便利な関数を追加したいと思います。

#funcs.py (new version)
import parser

def foo() :
    print "foo!"

def bar() :
    print "bar!"

def parse(commands="foo foo") :
    parser.execute(commands)

これで、パーサー自体から再帰的に解析できます。

>>> import parser
>>> parser.execute("parse")
foo!
foo!
>>> parser.execute("parse bar parse")
foo!
foo!
bar!
foo!
foo!

しかし、キー エラーが発生するため、何らかの理由でparseから実行することはできません。funcs

>>> import funcs
>>> funcs.parse("foo bar")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "funcs.py", line 11, in parse
    parser.execute(commands)
  File "parser.py", line 6, in execute
    function = globals()[c]
KeyError: 'foo'

そのため、行を介してfooインポートする必要がありますが、を介して使用されている場合は、の中に見つかりません。これはどのように起こりますか?parser.pyfrom funcs import *fooglobals()parser.pyfuncs.py

最後に、インポートしてから(ただしその順序でのみ)期待どおりに機能することを指摘する必要parserがありfuncsます。

>>> import parser
>>> import funcs
>>> funcs.parse("foo bar")
foo!
bar!
4

3 に答える 3

2

import module_name行うものとは根本的に異なることをfrom module_name import *行います。

前者は という名前のグローバルを作成します。module_nameこれは型moduleであり、属性としてアクセスされるモジュールの名前を含みます。後者は、 内のこれらの名前のそれぞれに対してグローバルを作成しますが、それ自体module_nameに対しては作成しませんmodule_name

したがって、import funcsfoobarに入れられない場合、それらglobals()を検索しても見つかりませんexecute

このような循環的な依存関係 ( importsparserからも import 名を取得funcsしようとする) は良くありません。明示的は暗黙的よりも優れています。これだけの魔法を作ろうとしないでください。利用できる機能を教えてください。funcsparserparse()

于 2010-12-02T03:40:14.993 に答える
0
  • パーサーをインポートした後にグローバルを印刷して、それが何をしたかを確認します
  • parserそれも組み込みモジュールです。通常、組み込みのパーサーはあなたのものではなくロードする必要があります。問題がないように名前を変更します。
  • funcs をインポートしますが、パーサーは * funcs からインポートしますか?

モジュールをインポートする順序と、それらが必要な場所について慎重に検討します。

于 2010-12-02T03:41:09.860 に答える
0

あなたの「パーサー」はかなり悪い考えです。

代わりにこれを行ってください。

def execute(*functions):
    for function in functions:
        function()

次に、python を開いて次の操作を行います。

>>> import parser
>>> from funcs import foo, bar 
>>> parser.execute(foo, bar, bar, foo)

関数自体が本当に意図したものである「文字列」を使用しなくても、人生はよりシンプルになります。

于 2010-12-02T03:47:42.400 に答える