如何添加内置函数

Rub*_*bia 13 python keyword built-in user-defined-functions

我是python编程的新手.如何使用C或C++向python解释器添加新的内置函数和关键字?

Dav*_*ver 23

简而言之,在技术上可以向Python的内置添加内容,但几乎从来没有必要(通常​​被认为是一个非常糟糕的主意).

更长的时间,显然可以修改Python的源代码并添加新的内置函数,关键字等......但是这样做的过程有点超出了问题的范围.

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

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

†:您可以修改__builtin__模块以"添加新的内置"...但这几乎肯定是一个坏主意:任何依赖于它的代码将非常困难(并且令人困惑)在原始应用程序的上下文之外的任何地方使用.例如,考虑添加greater_than_zero"内置",然后在其他地方使用它:

$ 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"
Run Code Online (Sandbox Code Playgroud)

任何试图阅读该代码的人都会感到困惑,因为他们不知道在哪里greater_than_zero定义,并且任何试图从没有偷偷greater_than_zero进入的应用程序中使用该代码的人__builtin__都无法使用它.

更好的方法是使用Python的现有import语句:http://docs.python.org/tutorial/modules.html

  • 实际上,你可以.`__builtins__`模块是可写的. (4认同)
  • @David,我没有说这是个好主意,但可以做到. (3认同)
  • @大卫.好的,但我很好奇你的论点是什么反对不这样做.这有什么问题?比"相信我"更好的东西.;-) (2认同)
  • 这是一个合法的用例:我的python应用程序有一个标志,可以在调试模式下启动.它为`__builtins__`添加了许多实用程序函数,以便在调试和调用pdb.set_trace()时可以在每个上下文中使用它们.这没关系,因为它只适合我自己的消费吗?我对SO答案真的很有说服力的方式感到恼火,感谢Keith为实际使这个网站的实用做出贡献.接受的答案具有误导性,Google的预览会让您相信这是一件非常困难的事情.这应该是固定的. (2认同)
  • 大卫,你确定它不应该是`__builtin__` 而不是`__builtins__`?请参阅 [Python:__builtin__ 和 __builtins__ 之间有什么区别?](http://stackoverflow.com/q/11181519/95735) (2认同)

pra*_*ary 6

对于 python 3.6 及以上版本使用import builtins


# 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


Run Code Online (Sandbox Code Playgroud)