问题标签 [single-dispatch]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
373 浏览

python - Travis pylint 构建失败并出现关于单次调度的错误

我的 Travis 构建目前在 pylint 失败并出现错误:

我目前用于 pylint 的构建命令是:

它适用于我的本地 Windows 机器(在 bash shell 中)。我的构建脚本的其余部分是:

我应该如何解决这个错误?提前致谢。

0 投票
0 回答
117 浏览

python - 装饰后更新单调度重载

前言

我正在使用带有装饰器的单一调度,例如functools.singledispatch

serialize_int现在如果我想有条件地装饰

然后打电话

正如我们所看到的,它调用了“旧”的、未修饰的版本。发生这种情况是因为我们只注册了“旧的”一个重载并且serialize对装饰一无所知,因为它是一个新的函数对象。

问题

如何修改重载,以便“调度程序”功能将获取更改?

我知道serialize_int装修后我们可以重新注册,但是看起来是代码重复的问题,还有其他方法吗?

或更笼统地说:我们能以某种方式就地修改函数对象吗?装饰__call__属性无济于事

0 投票
0 回答
64 浏览

python - 使包装器对象与@singledispatch 兼容?

假设我有这样的课程:

代码库的其他地方是使用 @singledispatch 装饰器的通用函数。我希望“包装”的实例表现得好像它们从未被包装过。因此,例如,pprint(Wrapper({}))将像pprint({})

我怎样才能做到这一点?

0 投票
1 回答
1516 浏览

python-3.x - 对解压的多个参数进行单次调度

我已经fancyfunction定义了对单个参数做某事。我把它装饰成一个通用函数,这样它就知道如果给它一个元组该做什么。

果然,上面两个函数的有效调用签名是:

我想做的事

我想简化调用签名,这样我就不需要额外的括号:

为了做到这一点,我需要重载函数来解包它的位置参数:

当然,上面的最后一个代码片段不起作用。这样做:

将调用泛型函数而不是重载函数。

是否可以singledispatch识别装饰函数是使用*-form of arguments 调用的?PS这种呼叫签名的正式名称是什么?

0 投票
0 回答
35 浏览

python - functools 库的示例不可重现

我正在研究functoolspython中的图书馆。但是,当我从装饰器的文档中复制示例时

@singledispatch

我没有得到与文档中报告的结果相同的结果。

应评估为:

但在我的 juypter notebook 中却没有。

0 投票
0 回答
202 浏览

python - 如何在类与实例上进行单一调度

这本质上是一个语法糖问题,所以如果你不赞成在这种事情上付出努力,请不要再读了。

考虑以下不起作用的玩具示例:

我想要做的是创建包含幻方行或列的实例,_data具体取决于我是否使用rows_or_cols(idx)rows_or_cols[idx]. 使事情复杂化的是我也想__getitem__在实例上可用,所以我可以通过rows_or_cols(ri)[ci]or选择一个单一的元素rows_or_cols[ci][ri]

什么不起作用是rows_or_cols[i]

我认为原因是这个https://stackoverflow.com/a/12447078/7207392

在这篇文章中,他们还建议使用元类。但是,我宁愿避免使用它们,因为我害怕元类冲突。

有什么建议(包括那些告诉我整件事一开始就是个愚蠢的想法的建议)?

0 投票
0 回答
148 浏览

python - python:范围类中的多个构造函数(__init__签名),怎么可能?

我知道python 中的多个构造函数是不可能的

但是,我发现 range 类有两个来自官方文档的__init__签名。

起初我以为它是这样实现的 def __init__(stop, start=None, step=None)但这会改变参数的顺序startstop

所以我检查了python源代码,范围类在这里有完全不同的方法:

谁能解释它是如何工作的?我们可以在我们的对象类中做同样的事情吗?

单次调度有关吗?

0 投票
1 回答
178 浏览

python - Pythonic(OO)根据对象类型选择类方法的方式

有没有更好的Pythonic / Object Oriented方式来选择在运行时执行哪个特定的类方法,具体取决于对象的类型,因为使用该type()方法不被认为是优雅的(?)

我为我正在使用的三种数据类型编写了以下代码。它基本上将不同的函数作为值存储在字典中,并将其与其对应的对象类型作为键配对:

它给出以下输出:

还有什么技术术语,我想在这里做什么?我认为这可能与单调度、函数重载或多态性有关,但我不确定。

0 投票
1 回答
158 浏览

python - 如何结合@singledispatch 和@lru_cache?

我有一个像这样的 Python 单调度通用函数:

它像这样重载:

第二个基本上预处理一个QuerySet对象并调用通用cluster()函数。一个QuerySet 是一个 Django 对象,但它不应该在这里发挥作用;除了它是可散列的,因此可以与lru_cache.

通用函数不能被缓存,因为它接受诸如列表之类的不可散列的对象作为参数。但是,重载函数可以被缓存,因为QuerySet对象是可散列的。这就是我添加@lru_cache()注释的原因。

但是,似乎没有应用缓存:

我希望在一个实例中进行相同的调用,但是:

缓存统计数据证实了这一点:

更改@lru_cache@.register注释的顺序似乎没有什么区别。

这个问题类似,但答案不适合单个功能级别。

甚至可以在这个级别上结合这两个注释吗?如果是这样,怎么做?

0 投票
1 回答
209 浏览

python-3.x - 将单调度与自定义类一起使用(CPython 3.8.2)

假设我想为名为“MacroMethods”的模块中的每个类设置函数。所以我在'Fluent Python'中看到它后设置了singledispatch,如下所示:

期望的行为是 - 当类 'MacroMethods.Wait' 的实例作为参数给出时,singledispatch 运行具有该类类型的注册函数。

相反,它运行默认功能而不是注册功能。

但是, type() 清楚地显示实例是类“MacroMethods.Wait”,并且 dict_keys 属性也包含它。

我怀疑我制作的所有自定义类都算作“对象”类型,并且没有在结果中运行所需的函数。

有什么办法可以解决这个问题?完整的代码在这里


更新

我设法模仿singledispatch的动作如下:

像这样使用:

但仍然不是singledispatch,所以我发现将其发布为答案可能不合适。