0
#!/usr/bin/env python`
import sys`
import binascii`
import string
sample = "foo.apples"
data_file = open("file1.py","r")
dat_file = open("file2.txt", "w")
for line in data_file:
    if sample in line:
        dat_file.writelines(line)
 dat_file.close()`

これを行うと、文字列 foo.apples を見つけることができます。問題はfoo.apples、python ファイルのさまざまな行に存在します。特定の関数内にある行が必要です。この def 関数内の行が必要です。

Example:

def start():
    foo.apples(a,b)
    foo.apples(c,d) ... so on.   
4

3 に答える 3

0

1 つは、モジュールのgetsourceメソッドを使用することです。inspect次の(理論上の)test1.pyファイルを考えてみましょう。

class foo(object):
    apples = 'granny_smith'
    @classmethod
    def new_apples(cls):
        cls.apples = 'macintosh'

def start():
    """This is a pretty meaningless python function.
    Attempts to run it will definitely result in an exception being thrown"""
    print foo.apples
    foo.apples = 3
    [x for x in range(10)]
    import bar as foo

startコードについて知りたい場合:

import inspect
import test1  #assume it is somewhere that can be imported

print inspect.getsource(test1.start)

わかりました、これでその関数のソースしかありません。それを解析できるようになりました。

for line in inspect.getsource(test1.start).splitlines():
    if 'foo.apples' in line:
        print line

ここにはいくつかの利点があります。Python は、ファイルをインポートするときに関数ブロックを解析するすべての作業を行います。欠点は、ファイルを実際にインポートする必要があることです。ファイルの送信元によっては、プログラムに巨大なセキュリティ ホールが発生する可能性があります。(潜在的に) 「信頼されていない」コードを実行することになります。

于 2012-12-18T21:55:18.140 に答える
0

次のプログラムはdefs を検索し、インデントがdef.

import re

sample = 'foo.apples'
data_file = open("file1.py", "r")
out_file = open("file2.txt", "w")
within_def = False
def_indent = 0

for line in data_file:
    def_match = re.match(r'(\s*)def\s+start\s*\(', line)  # EDIT: fixed regex
    if def_match and not within_def:
        within_def = True
        def_indent = len(def_match.group(1))
    elif within_def and re.match(r'\s{%s}\S' % def_indent, line):
        within_def = False

    if within_def and sample in line:
        out_file.writelines(line)

out_file.close()
data_file.close()

例での作業をテストしましたfile1.py

于 2012-12-18T22:14:21.037 に答える
0

これは非常に非pythonicな方法で、テストされていませんが、うまくいくはずです。

sample = "foo.apples"
infile = open("file1.py", "r")
outfile = open("file2.txt", "w")
in_function = False

for line in infile.readlines():
    if in_function:
        if line[0] in(" ", "\t"):
            if sample in line:
                outfile.write(line)
        else:
            in_function = False
    elif line.strip() == "def start():":
        in_function = True
infile.close()
outfile.close()

この関数を実行することをお勧めします。これはsample、入力ファイルと、検索することになっている関数をパラメーターとして受け取ります。次に、テキストを含むすべての行のリストまたはタプルを返します。

def findFromFile(file, word, function):
    in_function = False
    matches = []
    infile = open(file, "r")

    for line in infile.readlines():
        if in_function:
            if line[0] in(" ", "\t"):
                if word in line:
                    matches.append(line)
            else:
                in_function = False
        elif line.strip() == "def %s():"%function:
            in_function = True

    infile.close()
    return matches
于 2012-12-18T22:01:02.770 に答える