2

在 cPython >= 3.0 中,是否可以通过导入的模块向语言添加语句?假设我想实现一个 case/switch 语句,我可以把它写成一个模块,还是我必须按照PEP 306编辑 cPython 源文件并重新编译整个语言?

4

4 回答 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 回答