对峰值规则的扩展,用于对方法进行优先级排序,以避免方法不明确的情况

prioritized_methods的Python项目详细描述


本模块提供四个装饰器:

^{tt1}$

^{tt2}$

^{tt3}$

^{tt4}$

除了接受 可选的prio参数,可用于提供可比较的对象 (通常是整数)用来消除歧义的 超过规则适用于给定参数而没有规则的情况 比另一个更具体。也就是说,在这种情况下 peak.rules.AmbiguousMethods本应筹集。

这对于希望通过泛型函数进行扩展的库很有用 但是希望他们的用户可以轻松地重写一个方法,而不需要知道如何 写一个更具体的规则或当它不可行时。

例如,turbojson提供了一个jsonify函数,其外观如下:

>>> def jsonify(obj):
...     "jsonify an object"

并对其进行扩展,以便能够以某种方式处理sqlalchemy映射类 与此类似:

>>> from peak.rules import when

>>> def jsonify_sa(obj):
...     print "You're a SA object and I'm going to jsonify you!"

>>> when(jsonify, "hasattr(obj, 'c')")(jsonify_sa) # doctest: +ELLIPSIS
<function jsonify_sa at ...>

>>> class Person(object):
...     def __init__(self):
...         self.c = "im a stub"

>>> jsonify(Person())
You're a SA object and I'm going to jsonify you!

不过,到目前为止,当库的用户想要覆盖 在实现过程中,由于他们必须编写一个 可能很乏味的特定规则,例如:

hasattr(self, 'c') and isinstance(obj, Person)

注意hasattr测试,即使isinstance(obj, Person)暗示它, 只是为了使它比内置的更具体,这会使 表达变得更加复杂。

否则就会发生这种情况:

>>> def jsonify_Person(obj):
...     print "No way, I'm going to jsonify you!"

>>> when(jsonify, (Person,))(jsonify_Person) # doctest: +ELLIPSIS
<function jsonify_Person at ...>

>>> try:
...     jsonify(Person())
... except AmbiguousMethods:
...     print "I told you, gfs can sometimes be a pain"
I told you, gfs can sometimes be a pain

要纠正这种情况,prioritized_when可以用来提供 将重写用when

声明的实现
>>> def jsonify_Person2(obj):
...     print "No way, I'm going to jsonify you!"

>>> prioritized_when(jsonify, (Person,))(jsonify_Person2) # doctest: +ELLIPSIS
<function jsonify_Person2 at ...>

>>> jsonify(Person())
No way, I'm going to jsonify you!

注意,我们不需要prio参数。这是因为方法 用prioritized_when修饰的始终覆盖那些 用peak.rules.when装饰。

prioritized_when修饰的方法也可以重写其他方法 已经由同一个decorator使用prio参数进行了修饰, 如果两者相等的话,比较更大的胜利的人 AmbiguousMethods将照常筹集。

>>> def jsonify_Person3(obj):
...     print "Don't be so smart, I am, my prio is higher!"
>>> prioritized_when(jsonify, (Person,), prio=1)(jsonify_Person3) # doctest: +ELLIPSIS
<function jsonify_Person3 at ...>
>>> jsonify(Person())
Don't be so smart, I am, my prio is higher!

为了方便起见,还提供了一个genericdecorator,它的行为 像peak.rules.dispatch.generic除了when,…,``之后`` 将作为装饰函数的属性绑定的装饰器将 优先顺序:

>>> @generic
... def f(n): pass

>>> f(5)
Traceback (most recent call last):
    ...
NoApplicableMethods: ((5,), {})

添加默认规则:

>>> @f.when()
... def default_f(n):
...     return n
>>> f(5)
5

添加覆盖前者的默认规则:

>>> @f.when(prio=1)
... def new_default_f(n):
...     return n+1
>>> f(5)
6

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java什么会导致程序在它似乎拥有的监视器上被阻止?   java Android studio设置视图的背景色   java我可以保存一个文本文件而不给用户修改它的能力吗?   pdfbox PDFBOX2。0:java堆堆栈错误   java是维护和操作AllowList的有效方法   JAVAsql。SQLException:找不到适合jdbc的驱动程序:mysql://localhost:3306/asd性爱   如何使用java。lang.NullPointerException:void 安卓。支持v7。应用程序。ActionBar。setElevation(float)“”在空对象引用上'   java调试空指针异常   java正则表达式,以按令牌的特定匹配项拆分,同时忽略其他匹配项   java为JPanel设置边框上的笔划   并发@Schedule方法的java行为   如何在Java中使用泛型与语言运算符和泛型类扩展数   java Rhino Javascript如何为异常堆栈跟踪标记字符串源   运行可执行jar时发生java错误,无法找到或加载主类