<p>如果您已经移植了<strong>JD</strong>代码,并因此可以将其作为模块<strong>jday</strong>来控制,那么您可能正在寻找一个decorator。这有一个明显的好处,即不会破坏函数的原始签名(对于现有的客户机代码),但是根据您的请求添加了日期参数的便利性。在</p>
<p>jday()与jday()相同,但它也直接接受jday>模块。如果不需要向后兼容,这是最简单的解决方案。在</p>
<p>请参阅下面的工作示例代码:</p>
<p><strong>日.py</strong></p>
<pre><code>import math as m
import functools
def date_support_wrapper(f):
""" Wraps JD and provides a way to pass a date param
:param f: the original function
:return: the wrapper around the original function
"""
@functools.wraps(f)
def wrap(*args, **kwargs):
if 'date' in kwargs:
d = kwargs['date']
return f(yr=d.year, mon=d.month, day=d.day, hr=d.hour, min=d.minute, sec=d.second)
return f(*args, **kwargs)
return wrap
@date_support_wrapper
def JD(yr, mon, day, hr, min, sec):
jd = 367.0 * yr - m.floor(
(7 * (yr + m.floor((mon + 9) / 12.0))) * 0.25) + m.floor(
275 * mon / 9.0) + day + 1721013.5 + (
(sec / 60.0 + min) / 60.0 + hr) / 24.0
return jd
</code></pre>
<p><strong>jday2.py</strong></p>
^{pr2}$
<p>和示例客户端代码:</p>
<p><strong>客户端.py</strong></p>
<pre><code>import datetime
import jday
import jday2
# The date we are interested in
a = dict(year=2015, month=12, day=1, hour=22, minute=8, second=0)
dt = datetime.datetime(**a) # 2015-12-01 22:08:00
# The original signature of the function
jdate1 = jday.JD(a['year'], a["month"], a["day"], a["hour"], a["minute"], a["second"])
# 2457358.422222222
# The new signature that accepts a normal date object
# Note that we use keyword "date" argument
jdate2 = jday.JD(date=dt)
# 2457358.422222222
# The new signature that accepts a normal date object
jdate3 = jday2.JD(dt)
# 2457358.422222222
</code></pre>