Как несовершенный ярлык, как насчет того, чтобы дразнить logging
в определенных модулях с помощью чего-то как MiniMock?
, Например, если my_module.py
был:
import logging
class C(object):
def __init__(self, *args, **kw):
logging.info("Instantiating")
Вы заменили бы свое использование my_module
с:
from minimock import Mock
import my_module
my_module.logging = Mock('logging')
c = my_module.C()
необходимо было бы только сделать это однажды перед начальным импортом модуля.
Получение уровня определенное поведение было бы достаточно просто путем насмешки определенных методов, или наличие logging.getLogger
возвращает фиктивный объект с некоторым импотентом методов и другими, делегирующими к реальному logging
модуль.
На практике, Вы, вероятно, хотели бы заменить MiniMock чем-то более простым и более быстрым; по крайней мере что-то, что не печатает использование к stdout! Конечно, это не решает проблему модуля импорт logging
от модуля B (и следовательно также импорт гранулярности журнала B)...
Это никогда не не будет с такой скоростью, как выполнять операторы журнала вообще, но должно быть намного быстрее, чем попытка полностью в глубины регистрирующегося модуля только обнаружить, что эта запись не должна быть зарегистрирована, в конце концов.
Код был первоначально опубликован в сообщении блога «Функция Python Pretty Date» ( http://evaisse.com/post/93417709/python-pretty-date-function )
Он воспроизводится здесь, поскольку учетная запись блога была приостановлена и страница больше не доступна.
def pretty_date(time=False):
"""
Get a datetime object or a int() Epoch timestamp and return a
pretty string like 'an hour ago', 'Yesterday', '3 months ago',
'just now', etc
"""
from datetime import datetime
now = datetime.now()
if type(time) is int:
diff = now - datetime.fromtimestamp(time)
elif isinstance(time,datetime):
diff = now - time
elif not time:
diff = now - now
second_diff = diff.seconds
day_diff = diff.days
if day_diff < 0:
return ''
if day_diff == 0:
if second_diff < 10:
return "just now"
if second_diff < 60:
return str(second_diff) + " seconds ago"
if second_diff < 120:
return "a minute ago"
if second_diff < 3600:
return str(second_diff / 60) + " minutes ago"
if second_diff < 7200:
return "an hour ago"
if second_diff < 86400:
return str(second_diff / 3600) + " hours ago"
if day_diff == 1:
return "Yesterday"
if day_diff < 7:
return str(day_diff) + " days ago"
if day_diff < 31:
return str(day_diff / 7) + " weeks ago"
if day_diff < 365:
return str(day_diff / 30) + " months ago"
return str(day_diff / 365) + " years ago"
В поисках того же самого с дополнительным требованием обработки будущих дат я нашел следующее: http://pypi.python.org/pypi/py-pretty/1
Пример кода (с сайта):
from datetime import datetime, timedelta
now = datetime.now()
hrago = now - timedelta(hours=1)
yesterday = now - timedelta(days=1)
tomorrow = now + timedelta(days=1)
dayafter = now + timedelta(days=2)
import pretty
print pretty.date(now) # 'now'
print pretty.date(hrago) # 'an hour ago'
print pretty.date(hrago, short=True) # '1h ago'
print pretty.date(hrago, asdays=True) # 'today'
print pretty.date(yesterday, short=True) # 'yest'
print pretty.date(tomorrow) # 'tomorrow'
Я написал подробное сообщение в блоге о решении на http://sunilarora.org/17329071 Я публикую небольшой фрагмент здесь.
from datetime import datetime
from dateutil.relativedelta import relativedelta
def get_fancy_time(d, display_full_version = False):
"""Returns a user friendly date format
d: some datetime instace in the past
display_second_unit: True/False
"""
#some helpers lambda's
plural = lambda x: 's' if x > 1 else ''
singular = lambda x: x[:-1]
#convert pluran (years) --> to singular (year)
display_unit = lambda unit, name: '%s %s%s'%(unit, name, plural(unit)) if unit > 0 else ''
#time units we are interested in descending order of significance
tm_units = ['years', 'months', 'days', 'hours', 'minutes', 'seconds']
rdelta = relativedelta(datetime.utcnow(), d) #capture the date difference
for idx, tm_unit in enumerate(tm_units):
first_unit_val = getattr(rdelta, tm_unit)
if first_unit_val > 0:
primary_unit = display_unit(first_unit_val, singular(tm_unit))
if display_full_version and idx < len(tm_units)-1:
next_unit = tm_units[idx + 1]
second_unit_val = getattr(rdelta, next_unit)
if second_unit_val > 0:
secondary_unit = display_unit(second_unit_val, singular(next_unit))
return primary_unit + ', ' + secondary_unit
return primary_unit
return None