3

我知道repr()' 的目的是返回一个字符串,该字符串可用于作为 python 命令进行评估并返回相同的对象。不幸的是,pytz这个函数似乎不是很友好,虽然它应该很容易,因为pytz实例是通过一次调用创建的:

import datetime, pytz
now = datetime.datetime.now(pytz.timezone('Europe/Berlin'))
repr(now)

返回:

datetime.datetime(2010, 10, 1, 13, 2, 17, 659333, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>)

不能简单地将其复制到另一个 ipython 窗口并进行评估,因为它会在tzinfo属性上返回语法错误。

有什么简单的方法让它打印:

datetime.datetime(2010, 10, 1, 13, 2, 17, 659333, tzinfo=pytz.timezone('Europe/Berlin'))

当字符串在?'Europe/Berlin'的原始输出中已经清晰可见时repr()

4

1 回答 1

1
import datetime
import pytz
import pytz.tzinfo

def tzinfo_repr(self):
    return 'pytz.timezone({z})'.format(z=self.zone)
pytz.tzinfo.DstTzInfo.__repr__=tzinfo_repr

berlin=pytz.timezone('Europe/Berlin')
now = datetime.datetime.now(berlin)
print(repr(now))
# datetime.datetime(2010, 10, 1, 14, 39, 4, 456039, tzinfo=pytz.timezone("Europe/Berlin"))

请注意,由于夏令时,pytz.timezone("Europe/Berlin")夏季可能与冬季不同。pytz.timezone("Europe/Berlin"))因此,monkeypatched并不是对所有时间__repr__的正确表示。self但它应该在复制和粘贴到 IPython 期间工作(极端极端情况除外)。


另一种方法是子类datetime.tzinfo

class MyTimezone(datetime.tzinfo):
    def __init__(self,zone):
        self.timezone=pytz.timezone(zone)
    def __repr__(self):
        return 'MyTimezone("{z}")'.format(z=self.timezone.zone)
    def utcoffset(self, dt):
        return self.timezone._utcoffset
    def tzname(self, dt):
        return self.timezone._tzname
    def dst(self, dt):
        return self.timezone._dst

berlin=MyTimezone('Europe/Berlin')
now = datetime.datetime.now(berlin)
print(repr(now))
# datetime.datetime(2010, 10, 1, 19, 2, 58, 702758, tzinfo=MyTimezone("Europe/Berlin"))
于 2010-10-01T11:59:05.800 回答