python - 在 Python 3.4 中重用多个类型的函数参数是 pythonic,它与鸭子类型(duck typing)有何关系?我应该拆分功能吗?

标签 python types duck-typing

我来自 C# 和 Java,所以失去输入对我来说仍然是新事物,它可能会显示出来。

我有一个功能,可以向数据库发出查询,以删除最近发生的重复项。比如说,在过去 14 天左右。当脚本每天运行时,我希望它只使用像 14 这样的整数来回顾;然而,有时我可能想提供一个日期时间并让它直接使用它,而不是通过减去一个整数来计算它是什么日期。

以下是我目前所拥有的:

def clean_up_duplicates(dup_lookback):
    if hasattr(dup_lookback, 'strftime'):
        dup_start_str = dup_lookback.strftime('%Y-%m-%d %H:%M:%S')
    else:
        dup_start = date.today() - timedelta(days=dup_lookback)
        dup_start_str = dup_start.strftime('%Y-%m-%d %H:%M:%S')

    # ... continue on and use dup_start_str in a query.

这是 ducktyping 的正确用法吗?这是 pythonic 吗?

在我的脑海中,我的替代方案是分成两个功能:

def clean_up_duplicates_since_days(dup_lookback_days):
    dup_start_str = dup_lookback.strftime('%Y-%m-%d %H:%M:%S')
    __clean_up_duplicates(dup_start_str)

def clean_up_duplicates_since_datetime(dup_lookback_datetime):
    dup_start = date.today() - timedelta(days=dup_lookback)
    dup_start_str = dup_start.strftime('%Y-%m-%d %H:%M:%S')
    __clean_up_duplicates(dup_start_str)

def __clean_up_duplicates(dup_start_str):
    # ... continue on and use dup_start_str in a query.

(在浏览器中编码最后一点,所以可能会关闭)

最佳答案

鸭子类型(duck typing)意味着您假设一个对象包含一个函数,如果它包含一个函数,那么一切正常。

如果在函数不存在的情况下有替代路径可以使用,则使用 try/except 捕获它。

def clean_up_duplicates(dup_lookback):
    try:
        dup_start_str = dup_lookback.strftime('%Y-%m-%d %H:%M:%S')
    except AttributeError:
        dup_start = date.today() - timedelta(days=dup_lookback)
        dup_start_str = dup_start.strftime('%Y-%m-%d %H:%M:%S')

关于python - 在 Python 3.4 中重用多个类型的函数参数是 pythonic,它与鸭子类型(duck typing)有何关系?我应该拆分功能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29931140/

相关文章:

Python:如何从txt文件中的特定单词开始读取到文件末尾

python - 按 id 汇总多个字符串列 - python

java - 如何在 Java 中使用数组进行类型泛型?

c# - 返回共享一个方法的不同类型的两个可能对象之一

python - IBM Watson Speech to Text Audio/Basic 不接受窄带 .WAV

python - 如何计算 Cassandra 中特定列族的行键数(阅读详情)

scala - 为什么 Future[Set[Unit]] 不被接受为 Future[Unit]?

c# 转换为从类型名获取的类型作为字符串

delphi - 在 Delphi 2007 中鸭子类型(duck typing)?

java - 接受带有 toString() 方法的任何对象作为参数