Обязательно примите ответ Бимейла. У меня есть пара вещей, которые могут быть полезны.
Это правда, проблема, которую вы видели, была с упорядочением "аргументов" до partial
:
>>> from functools import partial
>>> from datetime import datetime
>>> datetime.strptime("2/3/2016", "%m/%d/%Y")
datetime.datetime(2016, 2, 3, 0, 0)
>>> partial(datetime.strptime, "%m/%d/%Y")("2/3/2016")
Traceback (most recent call last):
ValueError: time data '%m/%d/%Y' does not match format '2/3/2016'
И действительно, если вы измените аргументы, partial
работает:
>>> partial(datetime.strptime, "2/3/2016")("%m/%d/%Y")
datetime.datetime(2016, 2, 3, 0, 0)
Но это, конечно, не то, что вы хотите.
Итак, вы можете подумать, что можете воспользоваться преимуществами kwargs здесь ... на самом деле, если вы посмотрите на документы, там написано:
classmethod datetime.strptime (date_string, формат)
Возвращает дату и время, соответствующие строке date_string, проанализированные в соответствии с форматом.
Итак, давайте попробуем это:
>>> partial(datetime.strptime, format="%m/%d/%Y")("2/3/2016")
Traceback (most recent call last):
TypeError: strptime() takes no keyword arguments
Не принимает аргументов с ключевыми словами! КАКИЕ?! Ну да, большинство функций, которые "исходят из C", на самом деле этого не делают! По умолчанию функции, которые вы пишете сами в Python, всегда будут иметь kwargs, если только вы не используете замечательную новую функцию, начиная с Python 3.8, которая позволяет вам запрещать их .
Интересно, если вы сделаете свой собственный strptime:
>>> def my_strptime(date_string, format):
... return datetime.strptime(date_string, format)
...
Тогда вы можете делать, что хотите!
>>> partial(my_strptime, format="%m/%d/%Y")("2/3/2016")
datetime.datetime(2016, 2, 3, 0, 0)
при условии, что вы используете kwarg format
.