Python 如何添加内置函数?

Python 如何添加内置函数?,python,user-defined-functions,keyword,built-in,Python,User Defined Functions,Keyword,Built In,我是python编程新手。如何使用C或C++ + 向Python解释器中添加新的内置函数和关键字?简而言之,在Python的构建中添加技术是可能的,但是它几乎是不必要的(并且通常被认为是一个非常糟糕的想法)。 从长远来看,显然可以修改Python的源代码并添加新的内置代码、关键字等……但这样做的过程有点超出了问题的范围 如果您想了解更多关于如何修改Python源代码、如何编写可从Python调用的C函数或其他内容的详细信息,请编辑该问题,使其更加具体 如果您是Python编程新手,并且觉得应该

我是python编程新手。如何使用C或C++ +

向Python解释器中添加新的内置函数和关键字?简而言之,在Python的构建中添加技术是可能的,但是它几乎是不必要的(并且通常被认为是一个非常糟糕的想法)。 从长远来看,显然可以修改Python的源代码并添加新的内置代码、关键字等……但这样做的过程有点超出了问题的范围

如果您想了解更多关于如何修改Python源代码、如何编写可从Python调用的C函数或其他内容的详细信息,请编辑该问题,使其更加具体

如果您是Python编程新手,并且觉得应该在日常工作中修改核心语言,那么这可能是一个指标,您只需了解更多。Python未经修改地用于大量不同的问题域(例如,它是一个促进科学计算并将其用于3D动画的扩展),因此该语言很可能也能处理您的问题域

†:您可以修改
\uuuuu builtin\uuuuu
模块以“添加新的内置项”……但这几乎肯定是一个坏主意:任何依赖于它的代码在其原始应用程序上下文之外的任何地方都很难使用(并且容易混淆)。例如,如果你添加了一个<代码> GraveShanthOx0“构建”,然后在别处使用它:

$ cat foo.py
import __builtin__
__builtin__.greater_than_zero = lambda x: x > 0

def foo(x):
    if greater_than_zero(x):
        return "greater"
    return "smaller"
任何试图读取该代码的人都会感到困惑,因为他们不知道
大于零
是在哪里定义的,并且任何试图从没有潜入
大于零
的应用程序中使用该代码的人都将无法使用它


更好的方法是使用Python现有的
import
语句:

对于Python3.6以后的版本,使用
import内置项


# example 1

import builtins

def f():
    print('f is called')

builtins.g = f

g() # output = f is called

####################################
# example 2

import builtins

k = print

def f(s):
    k('new print called : ' + s)

builtins.print = f

print('abc') # output = new print is called abc



虽然David Wolever的答案是完美的,但应该再次指出,询问者是Python新手。基本上,他想要的只是一个全局函数,可以用两种不同的方式来实现

  • 在模块中定义一个函数并使用它
  • 在不同的模块中定义函数,并使用“from module import*”语句将其导入
  • 我认为询问者的解决方案是第二种选择,任何对Python不熟悉的人都应该考虑同样的问题

    对于高级用户,我同意Wolever的建议,即在内置模块中插入新函数是个坏主意。但是,用户可能正在寻找一种方法,以避免在项目中的每个脚本中导入始终使用的模块。这是一个有效的用例。当然,对于那些不属于项目的人来说,代码是没有意义的,但这不应该是一个问题。无论如何,这样的用户应该查看PYTHONSTARTUP环境变量。我建议在Python文档的索引中查找它,并查看所有讨论此环境变量的链接,看看哪个页面适合您的目的。但是,此解决方案仅适用于交互模式,不适用于子主脚本

    对于全面解决方案查看我已实现的此功能:

    另一种方法是扩展嵌入Python,这是一个相对复杂的主题。最好同时阅读Python文档。对于基本用户,我想说的是

    • 扩展意味着向Python解释器添加新的内置模块
    • 嵌入意味着在应用程序中插入Python解释器

    高级用户已经知道他们在做什么了

    使用模块还是修改Python源代码?为什么要这样做?试着编写一个模块,然后导入它。为什么你需要添加(特别是)内置函数甚至关键字?你可以用普通的Python函数做很多事情。实际上,你可以。
    \uuuu内置\uuuuu
    模块是可写的。@eryksun我有。但是当有人在Python上下文中说“builtin”时,它有一个特殊的含义。至少对我来说是这样。它基本上意味着它是一个全局对象。OP特别想破坏这种语言,甚至添加新的关键字。这不在内置函数中,但大部分语言实际上是那些内置函数。@david。好吧,但我很好奇你反对不这么做的理由是什么。怎么了?比“相信我”更好的东西;-)下面是一个合法的用例:我的python应用程序有一个在调试模式下启动的标志。它向
    \uuuu内置函数\uuuu
    中添加了许多实用函数,以便在调试和调用pdb.set\u trace()时,它们在每个上下文中都可用。这没什么问题,因为它只供我自己食用,对吗?我对这样的方式感到恼火,所以答案可能会变得非常说教,感谢Keith为使这个网站变得有用所做的贡献。被接受的答案是误导性的,谷歌的预览让你相信这是一件非常困难的事情。这应该是固定的。David,你确定它不应该是
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    而不是
    ?看见