在Python 3.4 pythonic中重用多个类型的函数参数,它与duck typing有什么关系?

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这样的整数进行回退;但是,有时我可能希望提供一个日期时间并让它直接使用它,而不是通过减去整数来计算日期。

以下是我目前的情况:

1
2
3
4
5
6
7
8
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.

这是杜克字体的正确用法吗?这是Python吗?

我的另一个选择,我的头顶,是分为两个功能:

1
2
3
4
5
6
7
8
9
10
11
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类型意味着你假设一个对象包含一个函数,如果它包含一个函数,那么一切都会正常工作。

如果函数不存在,则需要使用另一条路径,使用try/except捕获它。

1
2
3
4
5
6
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')