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中有成语吗?提前致谢.
不要键入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.请注意,这种情况很少见,最好避免过早优化.通过捕获异常,然后测试 - 如果您发现它是瓶颈,然后进行优化来实现.