Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以通过导入将语句添加到python3?还是我必须修改c文件并重新编译_Python_Python 3.x - Fatal编程技术网

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

是否可以通过导入将语句添加到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):

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

不要尝试。您必须编辑源代码并重新编译

相反,问问自己为什么需要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")

否,无法添加语句。您必须找到使用函数、类和/或对象的变通方法

对于开关/机箱:您可以通过多种方式进行操作

例如,仅凭一句口述:

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的打印实现,这取决于您想学习什么。