18

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

4

4 回答 4

28

简而言之,在Python 的内置函数中添加东西在技术上是可行的†</sup>,但几乎从来没有必要(并且通常被认为是一个非常糟糕的主意)。

在更长的时间内,显然可以修改 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

于 2011-08-06T06:02:30.457 回答
5

对于 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


于 2019-12-17T09:12:28.890 回答
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!
于 2021-12-10T13:22:30.013 回答
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 解释器插入到您的应用程序中。

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

于 2021-06-09T16:30:56.380 回答