【问题标题】:What is the pythonic way for method overloading?方法重载的pythonic方式是什么?
【发布时间】:2017-09-08 06:04:56
【问题描述】:

目前我专注于编写代码的 Pythonic 方式,我遇到了两种情况,我想知道什么是最好的。

首先是方法重载的情况,这在python中是没有的。我将如何最好地解决我有一个从数据库中获取数据的函数的情况,但是根据参数是整数还是整数列表,查询会有所不同。示例:

def getData(ids):
    if type(ids) == int:
        # query the database in an efficient manner for a single ID
    elif type(ids) is list:
        # query the database in a different manner efficiently for multiple ID's
        # also return the data differently

我是在一个函数中完成所有工作,还是使用从上述函数调用的不同函数来完成工作?或者我是否只需要根据我是否有 ID 列表或只有一个 ID 显式调用不同的函数?你认为什么是最好的?

【问题讨论】:

  • 避免“你更喜欢哪个”的问题,因为这些问题是基于意见的,并且通常是封闭的。使问题尽可能客观。
  • 就个人而言,对于您的第一个问题,我认为让每个“分支”都有自己的功能更有意义。有一个 getByID 和 getByMultipleID 函数。然后,如果你想平滑它的使用,有一个 getData 函数来决定使用哪个。将决策逻辑与“获取”逻辑分开应该会使代码更简洁。
  • 我提名这个问题重新打开,因为它已经被编辑了。但在这种情况下,它应该是“如何将整数或列表/可迭代”传递给同一个函数并检测 args 的副本。不过,约翰的回答很适合我。
  • 如果返回值也不同(即第一种情况是单个列表,第二种情况是列表列表或列表的字典),那么它实际上应该是两个不同的函数。否则,它确实是“如何传递整数或列表/可迭代”副本。
  • stackoverflow.com/a/24602374/5320906 是使用 functools.singledispatch 和实例方法的示例,如果您使用的是 python 3.4 或更高版本。

标签: python


【解决方案1】:

使用isinstance:

import collections

def getData(ids):
    if isinstance(ids, collections.Iterable):
        # query the database efficiently for multiple ID's
    else:
        # query the database in an efficient manner for a single ID

【讨论】:

  • 不确定它是否会回答,但它很有帮助。不过要小心,如果传递了一个字符串,那么它就会被视为可迭代的。目的可能是检查列表,但也检查集合、字典...
猜你喜欢
  • 2022-12-15
  • 2014-02-20
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 2012-05-02
  • 2013-04-25
  • 2015-09-11
  • 1970-01-01
相关资源
最近更新 更多