动态类型设计:处理列表的递归性是一个好的设计吗?

Rav*_*ine 1 python coding-style list 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
Run Code Online (Sandbox Code Playgroud)

我对此感到非常不安,因为我认为一种方法应该只做一件事,而我认为它不像它应该的那样可读.所以,我很想做三个函数:第一个是"任何对象"和"排序"在另外两个之间,一个用于列表,另一个用于"简单"对象.然后,这会增加一些复杂性.

什么是最"可持续"的解决方案,以及保证易于维护的解决方案?对于那些我不知道的情况,python中有成语吗?提前致谢.

Gar*_*tty 6

不要键入check - 做你想做的事情,如果它不起作用,它会抛出一个你可以捕获和管理的异常.

蟒蛇口头禅是" 请求宽恕,而不是许可 ".类型检查需要额外的时间,在大多数情况下,它将是毫无意义的.在鸭子类型的环境中它也没有多大意义 - 如果它有效,谁在乎它为什么键入它?当其他iterables也可以工作时,为什么要将自己限制在列表中?

例如:

def some_function(object_that_could_be_a_list):
    try:
        for element in object_that_could_be_a_list:
            some_function(element)
    except TypeError:
        ...
Run Code Online (Sandbox Code Playgroud)

这更具可读性,可以在更多情况下使用(如果我传入任何其他不是列表的迭代,有很多)并且通常会更快.

请注意,您的术语混淆了.Python是动态类型的,但不是弱类型的.弱类型意味着对象根据需要更改类型.例如,如果添加字符串和int,它会将字符串转换为int以进行添加.Python不没有做到这一点.动态类型意味着你没有为变量声明一个类型,它可能在某个时候包含一个字符串,然后是一个int.

鸭子打字是一个术语,用于描述对象的使用而不关心它的类型.如果它像鸭子一样走路,像鸭子一样嘎嘎叫 - 它可能是一只鸭子.

现在,这是一般性的事情,如果您认为您的代码将比"正确"更频繁地获得"错误"类型的对象,那么您可能需要键入check for speed.请注意,这种情况很少见,最好避免过早优化.通过捕获异常,然后测试 - 如果您发现它是瓶颈,然后进行优化来实现.

  • 面向迭代时该方法的一个常见问题是字符串是可迭代的,因此您可能需要显式类型检查来捕获字符串. (2认同)
  • 这就是事情 - 许多人都在努力使用流量控制的异常,因为它被其他语言的人击败是错误的.它实际上很有意义,它可以阻止竞争条件,它可以在很多情况下提供更好的性能(奇怪),并且它读得更好.尝试一下,如果它确实让你慢下来,稍后再进行优化,但我可以说它可能在99%的时间内不会出现问题. (2认同)