【问题标题】:How to define polymorphic python optional parameter?如何定义多态python可选参数?
【发布时间】:2016-02-19 22:33:46
【问题描述】:

我的问题是关于如何定义一个可以是不同类型(多态)的可选参数。

我试图在 python 3.x 中围绕functools.reduce 定义一个包装器,并注意到有一个可选参数,[initializer]。我试图定义相同的可选参数,但不知道如何。 Search around 表明我通常可以执行以下操作:

def info(object, spacing=10, collapse=1):

但在这种情况下,initializer 可以是具有不同默认值的许多不同类型。例如,它可以是0 用于添加(作为reduce 函数)和""(空字符串)用于字符串连接。这个参数应该怎么定义?

【问题讨论】:

  • 在 Python 中期望和处理不同类型的参数并不罕见(但通常是不明智的),例如if type(var) is str: do_stuff.
  • It's not uncommon (but generally ill-advised) to expect and handle different types of argument in Python@zamuz 好的。但这是标准的python库函数(reduce)。
  • 您能说明一下您要达到的目标吗?参数类型在运行时确定(即您从不定义参数类型)。查看实际结果与预期结果会很有帮助
  • @tinlyx:functools.reduce的pydoc有reduce(function, sequence[, initial]) -> value,其中[, initial]在计算中“放在序列的项目之前,当序列为空时作为默认值。 " initial 的类型不会根据自己的内容/类型修改/控制reduce 的行为。
  • @ProfHase85 与 OP 一样,我正在尝试提供 reduce 函数的包装器。

标签: python python-3.x optional-parameters


【解决方案1】:

那么简单呢?

def reduce_wrapper(custom_param, function, iterable, *args):
    # do stuff
    reduce(function, iterable, *args)

【讨论】:

  • 谢谢。我试过这个,例如:def reduce_(f,xs,init=None): return functools.reduce(f,xs,init) 然后reduce_ ((lambda x,y:x+y), [1,2,3])。但我得到了:TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
  • 对此感到抱歉。文档中似乎存在不匹配。看起来初始化器是一个简单的位置参数
  • 谢谢。这很好用。不过仍然很好奇,位置参数如何解决functools.reduce 内部的问题。
  • reduce 函数似乎不是 python 函数,而是一些奇怪的编译产品。所以我没有找到获取签名的方法。但是如果你开始使用 reduce 函数,你会发现它没有使用关键字参数(例如,你不能输入像 reduce(...., initializer=5) 这样的东西。这意味着它是一个没有定义值的位置参数
猜你喜欢
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 2018-05-07
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
相关资源
最近更新 更多