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