为什么在使用 `functools.partial` 调用时,python 的 `datetime.strptime` 函数的行为方式不同?

AAC*_*AAC 3 python datetime

这是我面临的错误示例:

In [1]: from functools import partial                                                                                             

In [2]: from datetime import datetime                                                                                             

In [3]: datetime.strptime("2/3/2016", "%m/%d/%Y")                                                                                 
Out[3]: datetime.datetime(2016, 2, 3, 0, 0)

In [4]: partial(datetime.strptime, "%m/%d/%Y")("2/3/2016")                                                                        
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-d803aff4879c> in <module>
----> 1 partial(datetime.strptime, "%m/%d/%Y")("2/3/2016")

~/miniconda3/envs/ROS/lib/python3.6/_strptime.py in _strptime_datetime(cls, data_string, format)
    563     """Return a class cls instance based on the input string and the
    564     format string."""
--> 565     tt, fraction = _strptime(data_string, format)
    566     tzname, gmtoff = tt[-2:]
    567     args = tt[:6] + (fraction,)

~/miniconda3/envs/ROS/lib/python3.6/_strptime.py in _strptime(data_string, format)
    360     if not found:
    361         raise ValueError("time data %r does not match format %r" %
--> 362                          (data_string, format))
    363     if len(data_string) != found.end():
    364         raise ValueError("unconverted data remains: %s" %

ValueError: time data '%m/%d/%Y' does not match format '2/3/2016'

Run Code Online (Sandbox Code Playgroud)

如何datetime.strptime使用partial? 这是我使用方式partial或使用方式的问题datetime.strptime吗?

hee*_*ayl 5

您首先将格式(应该是第二个参数)传递给strptimevia partial,然后传递日期字符串(应该是第一个参数),从而导致错误。

您不能像那样使用datetime.strptimewith partial,因为它不接受任何关键字参数。相反,您可以使用常规函数:

In [246]: def get_dt(string): 
     ...:     return datetime.strptime(string, "%m/%d/%Y") 
     ...:                                                                                                                                                                                                   

In [247]: get_dt("2/3/2016")                                                                                                                                                                                
Out[247]: datetime.datetime(2016, 2, 3, 0, 0)
Run Code Online (Sandbox Code Playgroud)