【问题标题】:How to add builtin functions?如何添加内置函数?
【发布时间】:2011-10-21 08:39:27
【问题描述】:

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

【问题讨论】:

  • 使用模块还是通过修改Python源?
  • 你为什么要这样做?只需尝试编写一个模块并导入它。
  • 为什么需要(特别)添加内置函数甚至关键字?你可以用普通的 Python 函数做很多事情。

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


【解决方案1】:

您可以使用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!

【讨论】:

    【解决方案2】:

    虽然 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 解释器插入到您的应用程序中。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        简而言之,技术上可以将东西添加到 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

        【讨论】:

        • 其实可以的。 __builtins__ 模块是可写的。
        • @eryksun 我有。但是当有人在 Python 上下文中说“内置”时,它具有特殊的含义。至少对我来说。它基本上意味着它是一个全局对象。 OP 特别想弄脏该语言,甚至添加新的关键字。这不是内置的,但大部分语言实际上是那些内置函数。
        • @david。好的,但我很好奇你反对不这样做的论点是什么。它有什么问题?比“相信我”更好的东西。 ;-)
        • 这是一个合法的用例:我的 python 应用程序有一个在调试模式下启动的标志。它向__builtins__ 添加了许多实用函数,以便在调试和调用pdb.set_trace() 时它们在每个上下文中都可用。这没什么错,因为它只是为了我自己的消费,对吧?我对 SO 的答案变得非常传教的方式感到恼火,感谢 Keith 为使这个网站真正有用所做的贡献。接受的答案具有误导性,Google 中的预览使您相信这是一件非常困难的事情。这应该是固定的。
        • 大卫,你确定不应该是__builtin__ 而不是__builtins__?见Python: What's the difference between builtin and builtins?
        猜你喜欢
        • 2017-01-09
        • 2022-08-03
        • 1970-01-01
        • 2020-06-21
        • 2018-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多