摆弄单位的工厂和职能
mtj.f3u1的Python项目详细描述
简介
F3U1-工厂和功能摆弄单位。
背景
很久以前,寻找一种将秒格式化为人的方法 一个英雄得到了可读的字符串。穿过国际米兰的网, 我们的英雄偶然发现了一个又一个地方,比如活跃状态 交换堆栈,甚至一些其他Git集线器。一些巨人 发现,就像数十行的重复一样,其他人都在触摸 奇怪的,无关的事情,看起来很复杂。说话的人 其他超凡脱俗的咒语毫无用处。最后,我们的英雄 站起来,用仙女的尸体建造了这个怪物:
def format_timedelta(delta_t): hours = delta_t.seconds / 3600 days = delta_t.days seconds = delta_t.seconds # Don't ask. Read the test; be happy you don't have to write this. # (WTB something simple like str(delta_t) with more control.) # (Maybe I should just do this in javascript?) return '%(day)s%(hour)s' % { 'day': days and '%(days)d day%(dayp)s%(comma)s' % { 'days': days, 'dayp': days != 1 and 's' or '', 'comma': seconds > 3599 and ', ' or '', } or '', 'hour': (hours > 0 or days == 0 and hours == 0) and '%(hours)d hour%(hourp)s' % { 'hours': hours, 'hourp': hours != 1 and 's' or '', } or '', }
(ooc:它实际上是经过测试的;参见最早的提交)。
然后我们的英雄意识到:有时一个德沃夫想要微观管理 几分钟后的决议,然后中层管理人员迪诺会来 把所有的事情都压回去,使决心不减 比一个星期的手术时间还要长。这些随意的变化 简单的事情会导致很多咬牙和噩梦 似乎永远不会结束。到处都是f7u12的叫声。
经过无数纳秒的冥想,我们的英雄摧毁了其中的4个 F和11个U朝着看不见的地平线的方向 解决方案被发现了,它超越了时间。
什么?
这导致了原始的f3u1工厂的创建 单位。用于拟合的其他描述,包括函数工厂 用于格式化单位或从单位的函数格式化函数。 然而,随着这个模块的成熟,它真正成为了工厂 以及摆弄单位的功能。
而这开始是一个模块,用于将时间格式化为对人类友好的 字符串,它被推广为能够格式化任意单位,比如 作为非公制测量单位,转换成人类可读的字符串那么 这进一步概括为可调用的对象,这些对象可以 用于构造一个表示某个值的对象,然后将其转换为 在同一个人类可读的字符串中。
怎么做?
只需在virtualenv安装程序中使用pip安装。
或者,您可以克隆此存储库以运行测试, 将需要在 requirements.txt:
$ git clone git://github.com/metatoaster/mtj.f3u1.git $ cd mtj.f3u1 $ pip install -r requirements.txt $ python setup.py develop
示例
使用预定义的单位:
>>> from mtj.f3u1.units import Time >>> value = Time(second=90210) >>> print value 1 day, 1 hour, 3 minutes, 30 seconds
或者创建自己的单位组:
>>> from mtj.f3u1.factory import UnitGroup >>> Custom = UnitGroup(base_unit='one', ratios={ ... 'thousand': 1000, ... 'hundred': 100, ... 'ten': 10, ... }) >>> custom = Custom(thousand=2, hundred=5, one=621) >>> print custom 3 thousand, 1 hundred, 2 ten, 1 one
也可以进行分辨率限制:
>>> value = Time('hour', second=99999) >>> print value 1 day, 3 hours
值的构造可以使用任何键作为定义的 单位:
>>> value = Time(hour=1, minute=99999) >>> print value 69 days, 11 hours, 39 minutes
任何单元定义都可以重新定义,以及它们的关联 复数形式:
>>> TimeWithWeek = Time.respecify({'week': 604800}, ... plurals={'week': 'weeks'}) >>> value = TimeWithWeek(hour=1, minute=99999) >>> print value 9 weeks, 6 days, 11 hours, 39 minutes
注意:目前这些值都限制为正整数。这个 将来可能会变得更加包容。也许如果我疯了 可能会在这里添加一个完整的单位转换和数学。
变更日志
0.2-2014年11月07日
- python 3兼容性。
- 允许指定元素之间的分隔符。
0.1-2013年4月10日
- 将时间格式化为可读字符串的核心功能是 提供。
- 还提供了其他单元,新单元可以从 比率的定义。