2011-05-23 73 views
2

說我有一個Python模塊foo.py其中包含:重寫一個Python腳本,每個腳本的類的注射方法

class Foo(object): 
    def __init__(self): 
     pass 

我接下來要分析此腳本,並在每個注射的方法它的類,它重新寫這樣的事情:

class Foo(object): 
    def __init__(self): 
     pass 
    def my_method(self): 
     pass # do some stuff here 

我發現Python 2.6中有一個ast模塊,可用於這一點,但不幸的是我需要做這在Python 2.5。歡迎任何建議。

+4

你實際上解析的.py Python源文本文件,並希望寫出來.py文件,或者是你在談論修改類運行時內存中的定義? – dkamins 2011-05-23 06:28:31

+1

@dkamins解析.py Python源文本文件並想寫出out.py文件 – 2011-05-23 07:41:36

回答

0

一個解決辦法是:

class Foo(object): 
    def __init__(self): 
     pass 

import new 

def some_func(self): 
    print "foobar" 

Foo.my_method = new.instancemethod(some_func, None, Foo) 

問題是,我不喜歡在文件末尾追加新的方法定義。我想在生成的腳本類的樣子:

class Foo(object): 
    def __init__(self): 
     pass 
    def my_method(self): 
     print "foobar" 

卻找不到沒有建立,對矯正,然後寫回sintax樹解決這個。

1

你已經有腳本了嗎?你應該能夠現在猴子補丁。爲了滿足當前的需求,這樣的事情就可以了:

class Foo(object): 
    def my_method(self): 
     pass 

或者,你可以定義my method,並把它添加到Foo類作爲一個屬性:

def my_method(self): 
    pass 

Foo.my_method = my_method 
#or 
Foo.__dict__.my_method = my_method 
+1

我認爲他希望在運行時動態添加它們,並且不指定每個類的名稱。類似於'foo.classes:spam.my_method = my_method'中的垃圾郵件。 – Evpok 2011-05-23 06:38:09

+1

我想過第二種方法。它不會像你的例子那樣直截了當,但它可以通過使用python的__new__模塊(http://docs.python.org/library/new.html)來工作。問題在於生成的腳本會很難閱讀,所以我更喜歡類似於你的第一個建議,但我不知道如何安全地做到這一點,而不必中繼構建語法樹,添加節點,然後重寫它... – 2011-05-23 06:47:34

+0

@Ioan你應該爲你的問題添加一個答案,並允許其他人爲它投票。這聽起來像一個明智的做法。 – 2011-05-23 09:58:07

2

我明白你想要做什麼,但是如果你的源代碼非常簡單,也許你可以跳過整個解析並完全寫回,只需運行正則表達式?

喜歡的東西:

re.sub('^class\s+(\w+):\s*\n', 'class \\1:\n%s' % method_source, file_source, flags=re.M) 

剛剛獲得壓痕的權利..

+0

這個例子就是爲了指出我正在努力完成的事情。我試圖編輯的實際源代碼是一個更復雜的腳本,因此我不會依賴純文本字符串解析。例如,通過查看您的正則表達式,我可以將'class'這個單詞作爲多行註釋的一部分,在這種情況下,正則表達式將失敗 – 2011-05-23 18:48:05

+0

實際上並沒有很多途徑讓它失敗。嵌套類不會被修補。你有什麼?他們應該補丁嗎?圍繞一個類的多行評論會發生的一切就是該類也將被編輯。如果你想要一個真正的解析器,你可以使用pyparsing和這個語法定義:http://pyparsing.wikispaces.com/file/view/pythonGrammarParser.py – Gurgeh 2011-05-23 20:26:41

+0

正則表達式不適用於新的樣式類。即使你解決了這個問題,你也可能會遇到這樣的情況:繼承的類會跨越多行。你也可以解決這個問題,但是,最終的正則表達式有可能成爲一個怪物。 – 2011-05-24 18:48:16

相關問題