是否可以通过导入向python3添加语句?或者我是否必须修改c文件并重新编译

时间:2012-06-29 21:56:21

标签: python python-3.x

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

4 个答案:

答案 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)