缺乏维护动态类型代码的经验,我正在寻找处理这种情况的最佳方法:
(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/