在 cPython >= 3.0 中,是否可以通过导入的模块向语言添加语句?假设我想实现一个 case/switch 语句,我可以把它写成一个模块,还是我必须按照PEP 306编辑 cPython 源文件并重新编译整个语言?
问问题
101 次
4 回答
4
假设您的新语言结构可以转换为标准 Python:是的,从技术上讲,它可以使用import hooks来完成。基本上,你必须阅读文件,用有效的 Python 代替你的语言结构(这个任务很可能需要一个完整的解析器),编译生成的 Python 源代码,并返回一个模块对象。不适合胆小的人,但它在技术上是可行的。
于 2012-06-29T22:28:22.097 回答
3
使用 if/elif 的阶梯来进行切换。不要与语言抗争。了解它擅长什么,然后做这些事情:
if x == 1:
do_1()
elif x == 2:
do_2()
elif x == 17:
do_17()
else:
something_else()
添加语句是一项重大工作,而将它们设计好则更加困难。在 python-ideas 邮件列表上已经讨论了关于 switch 语句的讨论。阅读这些以了解所涉及的问题。
于 2012-06-30T00:39:55.263 回答
2
甚至不要尝试。您必须编辑源代码并重新编译。
相反,问问自己为什么需要一个 switch 语句,并意识到它只是没有必要。
def firstfunction(x):
print(x)
def secondfunction(x):
print(x + 15)
def thirdfunction(x):
print(x / 15.0)
choices = {
'5': firstfunction,
5: secondfunction,
30: thirdfunction,
}
if x in choices:
choices[x](x)
else:
print("default case")
于 2012-06-29T22:02:07.600 回答
0
不,不能添加语句。您必须找到使用函数、类和/或对象的解决方法。
对于 switch/case 的情况:您可以通过多种方式进行操作。
例如,仅使用 dict:
def process(a):
d = {3: lambda: func1(1, 2, 3),
4: lambda: func2(3, 2, 1),
}
call = d.get(a, lambda: elsepart(a))
return call(a)
于 2012-06-29T22:02:33.980 回答