1

在像 java 这样使用静态绑定的语言中,您可以定义多个具有相同名称但参数不同的函数。学习 Python,直到现在我认为缺乏这个主要是“安全问题”(bool_parameter="False"可能被解释为True因为引号)。我想我只需要更加小心。

现在我发现了一种情况,缺少静态绑定简直不方便。请考虑这个元组:

var = ((1, "foo"), (2, "bar"), (3, "potato"))

要从var静态绑定中删除项目,可以执行以下操作(伪代码:

def del_item(int i):
    # search item with (x == i, *)
    # remove this item

def del_item(String s):
    # search item with (*, x == s)
    # remove this item

我觉得这很方便,因为不需要条件来选择要执行的正确操作。此外,此代码使重载更容易,因为可以决定只重载其中一个函数或两者。

试图在 Python 中处理这样的情况,我只发现一些不方便的解决方案,比如一些检查类型的 if 子句。

有没有更好的办法?

4

4 回答 4

2

Python 没有方法重载,所以抱歉,您必须检查参数的类型。

def del_item(item):
    if type(item) is int:
        # search item with (x == item, *)
        # remove this item
    elif type(item) is str:
        # search item with (*, x == s)
        # remove this item
    else:
        # Maybe raise an exception?
于 2014-11-23T13:29:34.563 回答
1

看看这个问题:Python 中 isinstance() 和 type() 的区别

如果您最终执行建议的 if 类型方法,您可能需要考虑使用鸭子类型或 isinstance 替代方案

于 2014-11-23T13:35:05.187 回答
1

您的问题可以通过使用通用方法/函数来解决。这些不是 python 内置的,但可以通过 3rd-party 库或您自己编写一个来使用。

几年前我一直在愉快地使用 PEAK 规则,但虽然它应该仍然有效,但它似乎有点失宠了。

新的 PEP 443(单参数调度)伴随着外部实现,单调度。https://pypi.python.org/pypi/singledispatch/3.4.0.3

有了这个,你的问题可以这样解决:

 from functools import partial
 from singledispatch import singledispatch


 var = ((1, "foo"), (2, "bar"), (3, "potato"))


 @singledispatch
 def del_predicate(value):
     pass


 @del_predicate.register(int)
 def _(v, candidate):
     return v == candidate[0]

 @del_predicate.register(str)
 def _(v, candidate):
     return v == candidate[1]


 def neg(f):
     def _f(*args):
         return not f(*args)
     return _f

 print filter(neg(partial(del_predicate, "foo")), var)
 print filter(neg(partial(del_predicate, 2)), var)
于 2014-11-23T13:53:33.803 回答
0

您给出的特殊情况似乎无论如何都不需要重载。

def del_item(id):
    return tuple(item for item in var if not id in item)

另一种选择是使用可选的关键字参数

def del_item(string_id=None, number_id=None):
    if string_id is not None:
        return tuple(item for item in var if not item[1] == string_id)
    return tuple(item for item in var if not item[0] == number_id)

以前有很多关于 python 重载的问题,这是一个答案,可能有助于理解为什么没有它不被视为问题。

于 2014-11-23T14:48:22.517 回答