Python 3.4 pythonic 中是否为多种类型重用函数参数,它与鸭子类型有何关系?我应该拆分功能吗?

Is reuse of a function argument for multiple types in Python 3.4 pythonic, and how does it relate to duck typing? Should I split the function up?

我来自 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.

(在浏览器中对最后一点进行了编码,因此可能已关闭)

鸭子打字意味着你假设一个对象包含一个函数,如果它包含那么一切正常。

如果函数不存在,如果有替代路径可以使用,请用 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')