如何添加内置函数?

25

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


1
通过模块还是修改Python源代码? - icktoofay
5
为什么你想要这样做?只需尝试编写一个模块并导入它即可。 - Keith
6
为什么需要添加(特别是)内置函数甚至关键字?使用普通的Python函数已经可以做很多事情了。 - Chris Lutz
5个回答

34
简单来说,技术上可以将东西添加到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


5
可以的。__builtins__ 模块是可写的。 - Keith
1
@eryksun 我有。但当有人在Python上下文中说“builtin”时,那有特殊的意义。至少对我而言。基本上它意味着它是一个全局对象。OP特别想要搞乱这个语言,甚至添加新的关键字。这不在内置中,但实际上该语言的很多部分都是这些内置函数。 - Keith
2
@david。好的,但我很好奇你反对不这样做的理由是什么。有什么比“相信我”更好的理由吗?;-) - Keith
4
这里有一个合法的使用案例:我的Python应用程序有一个标志来启动调试模式。它会向__builtins__添加许多实用函数,以便在调试时在每个上下文中都可用,并调用pdb.set_trace()。这没有任何问题,因为这只是为了我自己的消费,对吧?我对SO答案变得非常说教感到烦恼,感谢Keith为使该网站实际有用做出贡献。被接受的答案是误导性的,而Google的预览让你认为这是一件非常困难的事情。这应该被修复。 - spam_eggs
2
David,你确定应该使用__builtins__而不是__builtin__吗?请参考Python:__builtin__和__builtins__有什么区别? - Piotr Dobrogost
显示剩余7条评论

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



1
虽然David Wolever的回答很完美,但需要再次指出提问者是Python新手。基本上他只想要一个全局函数,这可以用两种不同的方式来实现...
1. 在你的模块中定义一个函数并使用它。 2. 在另一个模块中定义一个函数,并使用“from module import *”语句导入它。
我认为提问者的解决方案是第二个选项,任何新手都应该研究一下这个问题。
对于高级用户,我同意Wolever的建议,在内置模块中插入一个新函数是一个坏主意。然而,也许用户正在寻找一种方法来避免在项目中的每个脚本中导入一个经常使用的模块。这是一个有效的用例。当然,代码对于不是项目成员的人来说没有意义,但这不应该是一个问题。无论如何,这样的用户应该查看PYTHONSTARTUP环境变量。我建议在Python文档的索引中查找它,并查看所有谈论此环境变量的链接,看哪个页面符合您的目的。但是,此解决方案仅适用于交互模式,不适用于子主要脚本。

如果你需要一个全面的解决方案,可以查看我实现的这个函数:https://drive.google.com/file/d/19lpWd_h9ipiZgycjpZW01E34hbIWEbpa/view

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

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

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


0
你可以使用内置模块 builtins
示例1:
import builtins

def write(x):
    print(x)

builtins.write = write

write("hello")

# output:
# Hello

示例2:

import builtins

def hello(*name):
    print(f"Hello, {' '.join(name)}!")

builtins.hello = hello

hello("Clark", "Kent")

# output:
# Hello, Clark Kent!

0
不导入builtins模块:
# module A

def func(): ...

__builtins__.func = func

# module B

__builtins__['func']()  # or just func()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接