将python源代码加载到函数对象中

时间:2017-11-16 21:16:17

标签: python abstract-syntax-tree

我需要创建一个像单元测试一样的框架,用于单功能python任务的轻量级自动评分。我喜欢做以下事情:

test = """
def foo(x):
    return x * x
"""

compiled_module = magic_compile(test)
result = compiled_module.foo(3)
assert result == 9

是否有这样的magic_compile功能?我到目前为止最好的是

exec(test)
result = getattr(sys.modules[__name__], 'foo')(3)

但这似乎很危险且不稳定。这不会在生产中运行,因此我并不十分关注沙盒和安全性。只是想确保没有一个我错过的更好的解决方案。

1 个答案:

答案 0 :(得分:2)

在Python 3.x中:

Efort

public class Efort implements Parcelable { private String radioDaNu; private String tip; private Integer durata; private Integer inainte; private Integer dupa; public Efort(String radioDaNu, String tip, Integer durata, Integer inainte, Integer dupa) { this.radioDaNu = radioDaNu; this.tip = tip; this.durata = durata; this.inainte = inainte; this.dupa = dupa; } public String getRadioDaNu() { return radioDaNu; } public void setRadioDaNu(String radioDaNu) { this.radioDaNu = radioDaNu; } public String getTip() { return tip; } public void setTip(String tip) { this.tip = tip; } public Integer getDurata() { return durata; } public void setDurata(Integer durata) { this.durata = durata; } public Integer getInainte() { return inainte; } public void setInainte(Integer inainte) { this.inainte = inainte; } public Integer getDupa() { return dupa; } public void setDupa(Integer dupa) { this.dupa = dupa; } @Override public String toString() { return "Efort{" + // ", datePicker=" + datePicker + ", Activitate efort :" + radioDaNu + ", tip : '" + tip + '\'' + ", tipm de : " + durata + ", inainte de antrenamnet aveam : " + inainte + ", dupa antrenamnet am : " + dupa + '}'; } public Efort(Parcel in) { this.radioDaNu = in.readString(); this.tip = in.readString(); this.durata = in.readInt(); this.inainte = in.readInt(); this.dupa = in.readInt(); } public static Parcelable.Creator<Efort> CREATOR = new Creator<Efort>() { @Override public Efort createFromParcel(Parcel parcel) { return new Efort(parcel); } @Override public Efort[] newArray(int i) { return new Efort[i]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeString(radioDaNu); parcel.writeString(tip); parcel.writeInt(durata); parcel.writeInt(inainte); parcel.writeInt(dupa); } } 不是一个真正的Python模块,它只是一个名称空间来保存代码的全局变量以避免污染模块的命名空间。