Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Так нельзя писать. Это очень плохо. Это невозможно поддерживать. И я не пишу так.
Но от этого просто десткий восторг наступает. Запишите в одну строчку.
Это что-то из http://www.nestor.minsk.by/sr/2006/02/sr60201.html, только очень красиво.
Ну вообще говоря когдя я писал это оно было в одну строчку, точнее разрывы строки были каждые 80 символов. И даже всё понятно было.
Это сейчас чтоб хоть как-то разобраться что происходит - отформатировал.
Кстати помогло, нужное исправление сделал и рефакторить не пришлось. В конце концов это не ПО а скрипт=)
ul("%s %s" % (
realm,
ul(u"%s, запас %s, данные от %s" % (
link(
"%s-%s-data-1.html" % (realm, character),
faction(f, character),
"character"
),
gold(BeanCounterDB.settings[realm][character]["wealth"]),
time.strftime(
"%Y-%m-%d %H:%M:%S",
time.localtime(max(int(transaction.time) for transaction in getrows(data[realm][character])))
)
) for character, f in realchars[realm]
)
) for realm in realchars
)
Не надо лямбду выпиливать, я больше так не буду! 😀
> Интересно, к чему относится этот код?
Есть такая игра - WoW, в нем есть аукцион.
Есть такой аддон - http://auctioneeraddon.com/ , для анализа цен на игровом рынке и ведения логов торговли.
А я писал скрипт для внеигрового анализа "базы данных" этого аддона и представления html отчета по торговле своих персонажей, с графиками, топами и т.д.
Надеюсь, что к четвёртому Питону выпилят. Это одна из ошибок Гвидо, вроде целочисленного деления или строк-исключений.
1) Лямбда в Питоне не нужна. Есть удобнее средства. Более 90% случаев использования лямбды можно записать более ясно и понятно с помощью list comprehensions или yield (вот ещё добавят yield from (PEP 380) и будет вообще хорошо). Остальное делается с помощью локальных или глобальных именованных функций. Или готовых кирпичиков operator.
2) Лямбда в Питоне убога. Допускаются только простые выражения, ничего серьёзного. И не может быть, учитывая особенности питоновского синтаксиса. Вот лямбды, предлагаемые для C++ и Java лишены этого недостатка.
Насколько стар этот скрипт -- точнее, версия питона, под которую он был написан? Лет пять назад альтернатив было куда меньше, чем сейчас. Если на чем-то глаз и спотыкается -- то на пустых листах [] в качестве второго аргумента map и sum.
Полтора года скрипту. Для меня пока и такой срок "старый"=)
Python 2.5 или 2.6, не помню какой тогда у меня стоял.
А там суммируются списки, и так как по умолчанию он суммирует с 0, то пришлось указать стартовое значение []. Хотя вероятно такое суммирование не эффективно (в памяти создаётся много временных списков), но пока не нашёл стандартной функции для объединения произвольного количества списков.
def getrows(c):
return (transaction(category, itemstring, info)
for info in itemvalues
for itemstring, itemvalues in itemidset.iteritems()
for itemidset in c[category].itervalues()
for category in ("completedAuctions", "failedAuctions", "completedBidsBuyouts")
)
или
def getrows(c):
for category in ("completedAuctions", "failedAuctions", "completedBidsBuyouts"):
for itemidset in c[category].itervalues():
for itemstring, itemvalues in itemidset.iteritems():
for info in itemvalues:
yield transaction(category, itemstring, info)
>Причины такого ужаса - наверно отсутствие явной типизации в питоне и средств рефакторинга (rename variable, extract method, ...) в "IDE"
Нет, милейший, проблема в другом...
Но от этого просто десткий восторг наступает. Запишите в одну строчку.
Это что-то из http://www.nestor.minsk.by/sr/2006/02/sr60201.html, только очень красиво.
Это сейчас чтоб хоть как-то разобраться что происходит - отформатировал.
Кстати помогло, нужное исправление сделал и рефакторить не пришлось. В конце концов это не ПО а скрипт=)
Ох, недаром лямбду собирались выпилить.
Интересно, к чему относится этот код?
> Интересно, к чему относится этот код?
Есть такая игра - WoW, в нем есть аукцион.
Есть такой аддон - http://auctioneeraddon.com/ , для анализа цен на игровом рынке и ведения логов торговли.
А я писал скрипт для внеигрового анализа "базы данных" этого аддона и представления html отчета по торговле своих персонажей, с графиками, топами и т.д.
1) Лямбда в Питоне не нужна. Есть удобнее средства. Более 90% случаев использования лямбды можно записать более ясно и понятно с помощью list comprehensions или yield (вот ещё добавят yield from (PEP 380) и будет вообще хорошо). Остальное делается с помощью локальных или глобальных именованных функций. Или готовых кирпичиков operator.
2) Лямбда в Питоне убога. Допускаются только простые выражения, ничего серьёзного. И не может быть, учитывая особенности питоновского синтаксиса. Вот лямбды, предлагаемые для C++ и Java лишены этого недостатка.
Насколько стар этот скрипт -- точнее, версия питона, под которую он был написан? Лет пять назад альтернатив было куда меньше, чем сейчас. Если на чем-то глаз и спотыкается -- то на пустых листах [] в качестве второго аргумента map и sum.
Python 2.5 или 2.6, не помню какой тогда у меня стоял.
А там суммируются списки, и так как по умолчанию он суммирует с 0, то пришлось указать стартовое значение []. Хотя вероятно такое суммирование не эффективно (в памяти создаётся много временных списков), но пока не нашёл стандартной функции для объединения произвольного количества списков.
А так?
Но это квадратичная сложность, для линейной я уже нашёл itertools.chain
http://stackoverflow.com/questions/716477/join-list-of-lists-in-python
или
Код делает то же самое, что у меня, но намного красивее. И видимо эффективнее, так как у меня там форсировалось вычисление списков в sum.
Как-то не пришло в голову использовать ни множественный for в list comprehensions, ни yield, хотя знал о них.
Нет, милейший, проблема в другом...