在cPython> = 3.0中,是否可以通过导入的模块向语言添加语句?假设我想实现一个case / switch语句,我可以将其作为模块编写,还是必须按照PEP 306编辑cPython源文件并重新编译整个语言?
答案 0 :(得分:4)
假设您的新语言构造可以转换为标准Python:是的,从技术上讲,可以使用import hooks完成。基本上,你必须阅读文件,用有效的Python代替你的语言结构(一个可能需要完整解析器的任务),编译生成的Python源代码,然后返回一个模块对象。不适合胆小的人,但技术上可行。
答案 1 :(得分:3)
使用if / elif的梯形图进行切换。不要对抗语言。了解它做得好,并做这些事情:
if x == 1:
do_1()
elif x == 2:
do_2()
elif x == 17:
do_17()
else:
something_else()
添加语句是一项重大工作,设计得更好也更难。关于switch语句的python-ideas邮件列表已经讨论过了。阅读这些内容以了解所涉及的问题。
答案 2 :(得分: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")
答案 3 :(得分:0)
不,不能添加语句。您必须使用函数,类和/或对象找到变通方法。
对于开关/外壳的情况:您可以通过多种方式进行操作。
例如,仅仅是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)