python - 动态类型设计 : is recursivity for dealing with lists a good design?

标签 python list coding-style dynamic-typing

缺乏维护动态类型代码的经验,我正在寻找处理这种情况的最佳方法:

(python 中的示例,但可以使用任何动态类型语言)

def some_function(object_that_could_be_a_list):
     if isinstance(object_that_could_be_a_list, list):
          for element in object_that_could_be_a_list:
              some_function(element)
     else:
          # Do stuff that expects the object to have certain properties 
          # a list would not have

我对此感到很不安,因为我认为一个方法应该只做一件事,而且我认为它没有应有的可读性。因此,我很想创建三个函数:第一个函数将获取任何对象并在其他两个函数之间“排序”,一个用于列表,另一个用于“简单”对象。话又说回来,这会增加一些复杂性。

什么是这里最“可持续”的解决方案,以及保证易于维护的解决方案?对于我不知道的那些情况,python 中是否有一个习语?提前致谢。

最佳答案

不要输入检查 - 做你想做的,如果它不起作用,它会抛出一个你可以捕获和管理的异常。

python 的咒语是' ask for forgiveness, not permission '.类型检查需要额外的时间,而在大多数情况下,它是毫无意义的。它在鸭子类型的环境中也没有多大意义 - 如果它有效,谁在乎它为什么是类型?当其他可迭代对象也可以工作时,为什么要将自己限制在列表中?

例如:

def some_function(object_that_could_be_a_list):
    try:
        for element in object_that_could_be_a_list:
            some_function(element)
    except TypeError:
        ...

这更具可读性,适用于更多情况(如果我传入任何其他不是列表的可迭代对象,则有很多)并且通常会更快。

请注意,您混淆了术语。 Python 是 dynamically typed , 但不是 weakly typed .弱类型意味着对象根据需要改变类型。例如,如果您将一个字符串和一个整数相加,它会将字符串转换为一个整数来进行相加。 Python 不会这样做。动态类型意味着您不为变量声明类型,它可能在某个时候包含一个字符串,然后是一个 int。

Duck typing是一个术语,用于描述对象的使用而不关心它的类型。如果它走路像鸭子,叫声像鸭子 - 它可能是鸭子。

现在,这是普遍现象,如果您认为您的代码得到“错误”对象类型的频率高于“正确”对象类型,那么您可能需要进行类型检查以提高速度。请注意,这种情况很少见,最好避免过早优化。通过捕获异常来做到这一点,然后进行测试 - 如果您发现它是一个瓶颈,然后进行优化。

关于python - 动态类型设计 : is recursivity for dealing with lists a good design?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10155877/

相关文章:

python - 应用于每一列的 Pandas value_counts

python - Boto Dynamo 数据库错误

python - 如何使用 Python 写入 Excel 电子表格?

php - 从可能不存在而没有错误的数组值分配 PHP 变量的最快方法

c++ - 什么是意外宏替换?

python - 在 Python 中打开和搜索 dBase III (DBF) 数据库

java - 如何将列表/ map 与组合框一起使用

python - 将字典解压到 Pandas DataFrame 中

flutter - 如何在 Hive 中存储列表? - flutter

c# - C# 中的 try & catch 结构