7

このSOの質問を見て.py、2つの方法でファイルを作成し、それを読み取ろうとすることで使用してみました。
ファイル:

def f1(a):
    print "hello", a
    return 1

def f2(a,b):
    print "hello",a,", hello",b

それを読み込もうとしています:

>>> r = open('ToParse.py','r')
>>> t = ast.parse(r.read)

スローされた例外:

Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "C:\Python26\lib\ast.py", line 37, in parse
    return compile(expr, filename, mode, PyCF_ONLY_AST)
TypeError: expected a readable buffer object

私は何を間違っていますか?
私の目標は、モジュールを取得し、pythonそれを使用して解析できるようにすることですPython-そのクラスとメソッドを公開します。

4

4 に答える 4

8

を呼び出す必要がありますread。だからあなたのライン

t = ast.parse(r.read)

する必要があります

t = ast.parse(r.read())

ファイルに関する情報についてはこちらを、ast.parseに関する情報についてはこちらをご覧ください

于 2013-03-20T08:59:03.297 に答える
4

クラスとメソッドを動的に公開したい場合は、おそらくcompileと一緒にevalを使用する必要があります。

この場合、次のように行うことができます。

ファイルを作成します。

#test.py
def hello():
    print "hello"

そして、あなたはそれをこのように呼ぶことができます:

#main.py
testContent = open("test.py").read()
#evaluate a content
eval(compile(testContent, "<string>", 'exec'))
#call function
hello() #prints hello

編集:ファイルを評価する別の方法があります:

#main.py
#evaluate a content
eval(compile("import test", "<string>", 'exec')) #test.py
#check list of methods
dir(test) # ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'hello']
#call function
hello() #prints hello

私はevalそれが良い選択ではないかもしれないことを理解していますが、他の方法はわかりません。私は他の解決策を見てうれしいです

于 2013-03-20T09:00:57.250 に答える
4

使用する:

t = ast.parse(r.read()) # () is needed

ソース:http ://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

于 2013-03-20T08:52:31.537 に答える
2

ファイルで読み取られた関数を解析しようとしています。

あなたが欲しい

t = ast.parse(r.read())

または(例をより厳密に追跡するため)

text = r.read()
ast.parse(text)

いいえ

t = ast.parse(r.read)
于 2013-03-20T08:58:19.723 に答える