2014-10-12 82 views
0

我有一個簡單的函數,用生成的飛行一段代碼塊:Python代碼塊生成與實例

chunk = eval("(lambda " + ','.join(variables) + " : " + expression + ")", namespace) 

這就是後來的上運行使用:

apply(chunk, variableValues) 

這正常工作與基本像

variables = ["a", "b"] 
expression = "a != b" 
variableValues = [5, 6] 

但是,現在我想用實例和e代替這些簡單的變量xpression將是一個函數調用。我曾嘗試很多東西,但我不知道如何得到這個工作......我非常希望做這樣的事情:

variables = ["cellA", "cellB"] 
expression = "cellA.isEqual(cellB)" 
variableExpression = [Cell(4, 5), Cell(5, 3)] 

其中單元爲只是一些I類作出的isEqual實現()。

編輯:我不能跳過這個eval部分。這是一個解決約束滿足問題的簡單程序。程序的一部分是即時接受這些約束並創建這些代碼塊。

+1

請不要這樣做。如果可以避免使用eval和exec,那麼它們都不應該被使用,因爲它們造成了巨大的安全漏洞,並且難以進行調試。是否有理由不能將您的表達式和語句編寫爲可以使用例如參數化的函數? functools.partial?此外,還有python中的豐富比較方法,也許你可以考慮使用這些方法而不是isEqual。 – deets 2014-10-12 13:38:08

+1

不可能說沒有看到完整的代碼示例,爲什麼這不起作用。我同意deets,這可能是矯枉過正,並有可能更簡單的方法來做到這一點。另外,不要實現'isEqual',實現'__eq__',然後使用'cellA == cellB'。 – 2014-10-12 13:40:53

+0

我並不擔心調試的安全性,這是一個簡單的約束滿足求解器,這個簡單程序的主要觀點是它可以動態約束並將其轉換爲代碼塊。 – Limon 2014-10-12 13:41:29

回答

1

(這應該是一個評論,但過長)

工作正常,我在Python 2.7和3.2:

>>> variables = ["cellA", "cellB"] 
>>> expression = "cellA.isEqual(cellB)" 
>>> chunk = eval("(lambda " + ','.join(variables) + " : " + expression + ")") 
>>> chunk 
<function <lambda> at 0x6ffffcaa6e0> 
>>> class Cell(object): 
... def isEqual(self, other): 
...  return 27 
... 
>>> chunk(Cell(), Cell()) 
27 

如果你有問題,你需要表現出一定的代碼這證明了問題,而不是模糊地描述你認爲問題可能是什麼。

+0

謝謝,我不知道爲什麼這樣不能在早些時候工作?這基本上是我在我的開場白中寫的,這也是我在我的程序中嘗試過的,但它一直在崩潰。 – Limon 2014-10-12 13:59:37

0

對於您的實際問題,您可以簡單地使用unbound方法isEqual。

class Cell(object): 

    def __init__(self, *args): 
     self._args = args 

    def isEqual(self, other): 
     return self._args == other._args 


a = Cell(1,2) 
b = Cell(3, 4) 


f = Cell.isEqual 
print f(a, b)