如何添加内置函数

时间:2011-08-06 05:55:58

标签: python user-defined-functions keyword built-in

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

3 个答案:

答案 0 :(得分: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"

任何试图阅读该代码的人都会感到困惑,因为他们不知道greater_than_zero的定义位置,以及任何尝试使用该代码的人都没有偷偷摸摸greater_than_zero __builtin__将无法使用它。

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

答案 1 :(得分:0)

使用导入内置文件

import builtins

k = print

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

builtins.print = f

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

#################################
#another example

import builtins

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

builtins.g = f

g() # output = f is called

答案 2 :(得分:0)

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

  1. 在您的模块中定义一个函数并使用它。
  2. 在不同的模块中定义一个函数并使用“from module import *”语句导入它。

我认为提问者的解决方案是第二个选项,任何对 Python 有此问题的新手都应该考虑相同的问题。

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

有关全方位解决方案,请查看我已实现的此功能:https://drive.google.com/file/d/19lpWd_h9ipiZgycjpZW01E34hbIWEbpa/view

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

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

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