是否可以通过导入将语句添加到python3?还是我必须修改c文件并重新编译
在cPython>=3.0中,是否可以通过导入的模块向语言添加语句?假设我想要实现一个case/switch语句,我可以将其作为一个模块来编写,还是必须按照编辑cPython源文件并重新编译整个语言?不要尝试。您必须编辑源代码并重新编译 相反,问问自己为什么需要switch语句,并意识到这不是必需的是否可以通过导入将语句添加到python3?还是我必须修改c文件并重新编译,python,python-3.x,Python,Python 3.x,在cPython>=3.0中,是否可以通过导入的模块向语言添加语句?假设我想要实现一个case/switch语句,我可以将其作为一个模块来编写,还是必须按照编辑cPython源文件并重新编译整个语言?不要尝试。您必须编辑源代码并重新编译 相反,问问自己为什么需要switch语句,并意识到这不是必需的 def firstfunction(x): print(x) def secondfunction(x): print(x + 15) def thirdfunction(x):
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")
否,无法添加语句。您必须找到使用函数、类和/或对象的变通方法 对于开关/机箱:您可以通过多种方式进行操作 例如,仅凭一句口述:
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)
假设您的新语言构造可以转换为标准Python:是的,从技术上讲,可以使用。基本上,您必须读取文件,用有效的Python替换您的语言构造(这项任务可能需要一个完整的解析器),编译生成的Python源代码,并返回一个模块对象。不适合心脏虚弱的人,但在技术上是可行的。使用if/elif的阶梯来切换。不要与语言对抗。了解它擅长什么,然后做这些事情:
if x == 1:
do_1()
elif x == 2:
do_2()
elif x == 17:
do_17()
else:
something_else()
添加语句是一项重要的工作,而设计好它们就更难了。在python思想邮件列表中已经讨论了switch语句。阅读这些内容以了解所涉及的问题。此外,
案例/开关
基本上只是一个美化的if/elif/else
。如果您的应用程序足够简单,那么使用If/elif/else
就可以了。不过我错过了一个“直到”的声明<代码>虽然是真的有点傻。@LennartRegebro,为什么不能在x<5:时执行类似于的操作,然后在块中增加x?(或者当一些人列出时:
然后继续弹出并添加到列表中)@JeffTratner:嗯,因为如果我这样做,我会使用for循环while True
和break
是在Python中执行循环直到
的最简单、最清晰的方法。“这还是很愚蠢的。”LennartRegebro哈哈,好吧,当然。两者之间唯一的真正区别是for循环要求您在每次迭代时剥离值。或者,为执行的每一行代码使用跟踪挂钩:这也不是一个好主意。:-)不过,goto
技巧至少在开始时是有效的Python语法但一定有一种方法可以使switch语句同样是“pythonic”语句?我真的没有想过。goto.label
的解析方式与goto.label
相同,后者只是对名为goto
的对象的常规属性访问。因此,从Python开始是有效的。(与标签
“语句”相同)。诀窍是,捕捉它并让它做你想做的事情,在这种情况下,这可以通过跟踪钩子来完成;我也在一个装饰器中看到了字节码黑客的使用。我使用了一个case语句作为例子,但我真正想做的是看看是否可以在python3中重新实现print语句。我同意将打印从声明更改为方法背后的理性,不希望看到这一决定被推翻。但我希望看到python3的打印实现,这取决于您想学习什么。