- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是 python 编程的新手,我想知道如何增强内置函数的特性(Monkeypatch)
例如
我知道sum()内置函数只允许在数字项上使用
>>> sum([4,5,6,7]) #22
我想让 sum 函数允许项目列表作为字符串,如下所示
例如
>>> sum(['s','t','a','c','k']) # 'stack'
提前致谢
最佳答案
你不能像处理类、对象、模块等那样真正地“monkeypatch”一个函数。
那些其他的东西最终都归结为一组属性,因此用一个不同的属性替换一个属性,或者添加一个新的属性,既简单又有用。另一方面,函数基本上是原子的东西。*
当然,您可以通过替换 sum
函数来猴子修补内置模块。但我不认为那是你要问的。 (如果你是,请参阅下文。)
无论如何,你不能修补sum
,但你可以编写一个新函数,如果你愿意的话可以使用相同的名称,(可能对原始函数进行包装——你将注意,这正是装饰器所做的)。
但确实没有办法使用 sum(['s','t','a','c','k'])
来做你想做的事,因为 sum
默认情况下从 0 开始并向其添加内容。而且你不能将字符串添加到 0.**
当然,您始终可以传递显式 start
而不是使用默认值,但是您必须更改调用代码以发送适当的 start
。在某些情况下(例如,您要发送文字列表显示)这很明显;在其他情况下(例如,在通用函数中)它可能不是。这在这里仍然行不通,因为 sum(['s','t','a','c','k'], '')
只会引发一个 TypeError
(尝试并阅读错误以了解原因),但在其他情况下它会起作用。
但无法避免使用 sum
知道合适的起始值,因为这就是 sum
的工作原理。
如果您考虑一下,sum
在概念上等同于:
def sum(iterable, start=0):
reduce(operator.add, iterable, start)
这里唯一真正的问题是 start
,对吧? reduce
允许您省略起始值,它将从可迭代对象中的第一个值开始:
>>> reduce(operator.add, ['s', 't', 'a', 'c', 'k'])
'stack'
这是 sum
做不到的。但是,如果您真的想要,您可以重新定义 sum
,这样它可以:
>>> def sum(iterable):
... return reduce(operator.add, iterable)
……或者:
>>> sentinel = object()
>>> def sum(iterable, start=sentinel):
... if start is sentinel:
... return reduce(operator.add, iterable)
... else:
... return reduce(operator.add, iterable, start)
但请注意,此 sum
在处理整数时比原来的要慢得多,并且会引发 TypeError
而不是返回 0
在空序列上,依此类推。
如果您真的想对内置函数进行 monkeypatch(而不是仅仅定义一个具有新名称的新函数,或者在您的模块的 globals()
中定义一个具有相同名称的新函数来隐藏内置),这是一个适用于 Python 3.1+ 的示例,只要您的模块使用普通的全局字典(除非您在嵌入式解释器或 exec
调用或类似的情况下运行,否则它们将是):
import builtins
builtins.sum = _new_sum
换句话说,与 monkeypatching 任何其他模块相同。
在 2.x 中,该模块称为 __builtin__
。通过全局变量访问它的规则在 2.3 左右发生了变化,在 3.0 中又发生了变化。参见 builtins
/__builtin__
了解详情。
* 当然这不是完全是真的。函数在其代码对象之上有一个名称、一个闭包单元列表、一个文档字符串等。甚至代码对象也是一系列字节码,您可以在其上使用 bytecodehacks
或硬编码 hackery。除了 sum
实际上是一个内置函数,而不是一个函数,所以它甚至没有可从 Python 访问的代码……无论如何,对于大多数用途来说,它已经足够接近于说函数是原子的东西。
** 当然,您可以将字符串转换为某个知道如何将自身添加到整数(通过忽略它们)的子类,但实际上,您不想这样做。
关于python - 如何增强python中内置函数的特性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17098423/
目录 C#特性 1. 概括 2. 语法 定义特性类 应用特性
是否有关于 Python 语言必须提供哪些功能的文章/论文?为什么应该使用 Python 而不是任何其他语言? Python 的优点和缺点是什么? 最佳答案 Why Python和 Why Pytho
我想弄清楚为什么 .x比*.x具有更高的特异性当后者有望获胜时。 不是*.x应该具有 0-0-1-1 的特异性(1 个类,1 个标签)而 .x只是一个类(class) 0-0-1-0 ? 考虑以下基本
在尝试评估非 instanceof 条件时,我发现了我在 Groovy 2.4.7、1.6.0 JVM 中没有预料到的行为。 总之: class Foo { static Boolean
当使用可变结构和属性时,编译器可以解决一些问题,但不能对其他相当明显的事情做同样的事情,这对我来说似乎很奇怪。 以下面的自动属性为例: Vector2 Vector { get; set; } 而不是
我对 ES3 有一定的了解,但我对 ES5 的特性不是很了解。我 - 或多或少 - 知道: Object.create(), Object.freeze() “使用严格” getter 和 sette
我最近开始将 Django 1.5.4 用于带有 MySQL 后端的 Web 应用程序。就在一开始,我遇到了某些限制,这让我想知道 Django 是否是继续前进的正确方法。 一些明显的缺点是: 缺少复
在函数模板的定义中,模板参数的实例化一般是未知的。类型特征可用于在编译时获取一些信息。例如,这是 is_pointer 的一个简单应用: template void foo(T p) { cout
我正在设计页面的样式,该页面具有除最后一个框外的带底部边框的连续框。我为所有框应用类 .box 并添加 .box_last 以仅隐藏最后一个框的边框。 .box { border-bottom-s
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我有兴趣编制一份不建议在嵌入式系统中使用的 c++ 功能列表(这可能会导致人们推荐使用 c 而不是 c++)。如果您知道,请尝试添加原因,或者将您的原因添加到其他人的答案中。 这是一个开始(我知道的唯
作为一名 Ruby 程序员,您是否曾觉得任何使用起来有点冒险的功能,可能是因为它的奇怪行为?它可能有很好的文档记录,但在调试时很难找到,或者难以记住? 我通常尽量远离 String#gsub!。文档说
我正在开发一个连接到健身 watch 的蓝牙应用程序。这是我第一次使用蓝牙。我设法使用出色的 FlutterBlue 将我的应用程序与设备连接起来图书馆。 但是我无法理解我从阅读中获得的结果。这是我阅
1. 迭代器(Iterator)的介绍 背景:指针可以用来遍历存储空间连续的数据结构,但是对于存储空间费连续的,就需要寻找一个行为类似指针的类,来对非数组的数据结构进行遍历。 定义:迭代器是一种检
嗨,伙计们,有没有动态更改 Spring 属性文件内容的好例子?如果您能给我一些示例或链接,我将不胜感激。 非常感谢 最佳答案 我想你可以使用 ReloadableResourceBundleMess
SystemVerilog 引入了一些非常有用的结构来改进编码风格。然而,正如我的一位同事经常说的,“你不是在写软件,你是在描述硬件。”考虑到这一点,当最终结果需要合成时,应该避免语言的哪些特征?这个
我定义了这些测试依赖项 / Test Dependencies lazy val wiremock = "com.github.tomakehurst" % "wir
我正在为 Android 手机和 Android watch (wearOS) 编写应用程序。这些应用程序将通过蓝牙相互通信。基本上,Android 手机上的应用程序将与 WearOS 设备绑定(bi
我正在为 Android 手机和 Android watch (wearOS) 编写应用程序。这些应用程序将通过蓝牙相互通信。基本上,Android 手机上的应用程序将与 WearOS 设备绑定(bi
我有兴趣提高我的设计能力(设计具有属性、方法等的类)。即如何决定类、方法和属性应该是什么? 你们能建议我改进这个的好 Material 吗? 最佳答案 请看: Any source of good o
我是一名优秀的程序员,十分优秀!