【问题标题】:How do I define a postfix function in Python?如何在 Python 中定义后缀函数?
【发布时间】:2017-08-15 08:51:51
【问题描述】:

我知道,如果您创建自己的对象,则可以在该对象上定义自己的方法。

my_object_instance.mymethod()

我还知道您可以使用 infix 包定义中缀函数。

obj1 |func| obj2

我想要的是能够定义一个接受后缀符号的现有类型的函数。

例如给定一个列表l,我们可能想要检查它是否已排序。定义一个典型的函数可能会给我们

if is_sorted(l): #dosomething

但如果可以写的话可能会更惯用

if l.is_sorted(): #dosomething

如果不创建自定义类型,这可能吗?

【问题讨论】:

  • 如果你想要的是一个接受类型作为参数的函数,那么你不需要做任何事情;类型是 python 中的第一类对象
  • 后缀表示法是别的东西。

标签: python function postfix-notation


【解决方案1】:

正确的做法是继承,通过继承list创建自定义类型并添加新功能。 Monkeypatching 不是 Python 的强项。但既然你特别问:

如果不创建自定义类型,这可能吗?

kindall mentioned 代表什么,Python 不允许这样做。但是由于实现中没有任何东西是真正只读的,因此您可以通过修改类 dict 来近似结果。

>>> def is_sorted(my_list):
...     return sorted(my_list) == my_list
... 
>>> import gc
>>> gc.get_referents(list.__dict__)[0]['is_sorted'] = is_sorted
>>> [1,2,3].is_sorted()
True
>>> [1,3,2].is_sorted()
False

新的“方法”将出现在 vars(list) 中,名称将出现在 dir([]) 中,并且它也将在应用猴子补丁之前创建的实例上可用/可用.

此方法使用garbage collector interface 通过mappingproxy 类获取对底层字典的引用。通过引用计数进行垃圾收集是 CPython 的实现细节。可以这么说,这是危险的/脆弱的,你不应该在任何严肃的代码中使用它。

如果您喜欢这种功能,您可能会喜欢ruby 作为一种编程语言。

【讨论】:

  • 谢谢!这是完美的
【解决方案2】:

Python 通常不允许对内置类型进行猴子修补,因为常见的内置类型不是用 Python(而是 C)编写的,并且不允许修改类字典。您必须对它们进行子类化才能根据需要添加方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    相关资源
    最近更新 更多