Use of eval in Python, MATLAB, etc
我知道人们不应该使用
因为它是用几种语言实现的,并且可能导致糟糕的编程风格,所以我认为它仍然可用是有原因的。
首先,这里是MathWork的Eval备选方案列表。
您也可以很聪明,在编译后的应用程序中使用
在matlab中,当函数通过
1 2 3 4 | function display(X) eval([inputname(1), ' = X;']); eval(['builtin(''display'', ', inputname(1), ');']); end |
号
在matlab中也有
T = evalc(S) is the same as EVAL(S) except that anything that would
normally be written to the command window, except for error messages,
is captured and returned in the character array T (lines in T are
separated by '
' characters).
号
如果您仍然考虑这个
我发现合理使用
例如,可能有一个名为"data"的项,它有一个读写数据的位置,但也需要在加载时对其应用一些谓词。在yaml文件中,这可能看起来像:
1 2 3 4 5 | Data: Name: CustomerID ReadLoc: some_server.some_table WriteLoc: write_server.write_table Predicate:"lambda x: x[:4]" |
在从yaml加载和分析对象时,我可以使用
yaml提供了一些笨拙的方法来神奇地调用对象构造函数(例如,在上面的代码中使用类似于
我认为这种可以用任何XML工具轻松解析的简单设计更好,并且使用
关于我的案例中为什么这样做:
代码的用户不是Python程序员。他们没有能力编写自己的函数,然后只传递一个模块位置、函数名和参数签名(不过,将所有这些都放在参数文件中是解决这一问题的另一种方法,如果用户可以信任地编写代码,则不依赖于
用户对其糟糕的lambda函数负责。我可以验证
这些参数文件的用户组成了一个小组,大多数人都愿意遵守约定。如果这不是真的,那么人们会很危险地打招呼谓词字段来做许多不适当的事情——这很难防范。在大项目上,这不是一个好主意。
我不知道我的观点是否适用于一般情况,但我想说,如果你能保证你的用户是一小群惯例拥护者(我知道这是一个罕见的壮举),那么使用