我有一個簡單的函數,用生成的飛行一段代碼塊: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部分。這是一個解決約束滿足問題的簡單程序。程序的一部分是即時接受這些約束並創建這些代碼塊。
請不要這樣做。如果可以避免使用eval和exec,那麼它們都不應該被使用,因爲它們造成了巨大的安全漏洞,並且難以進行調試。是否有理由不能將您的表達式和語句編寫爲可以使用例如參數化的函數? functools.partial?此外,還有python中的豐富比較方法,也許你可以考慮使用這些方法而不是isEqual。 – deets 2014-10-12 13:38:08
不可能說沒有看到完整的代碼示例,爲什麼這不起作用。我同意deets,這可能是矯枉過正,並有可能更簡單的方法來做到這一點。另外,不要實現'isEqual',實現'__eq__',然後使用'cellA == cellB'。 – 2014-10-12 13:40:53
我並不擔心調試的安全性,這是一個簡單的約束滿足求解器,這個簡單程序的主要觀點是它可以動態約束並將其轉換爲代碼塊。 – Limon 2014-10-12 13:41:29