Mixaill 1,740 #407574 Posted October 18, 2017 1 час назад, jhakonen сказал: The document is under CC BY-SA 4.0 license. Does that mean that the code examples at chapter 8 are also under that license? According to Creative Commons's compatible license page that license is compatible with itself, Free Art license and GPLv3. Can I use some other open source license instead, like MIT license or LGPL 2.1 and still use the code in my mod? Nice question. Code samples were relicensed under WTFPL so you can :) packages_doc_0.6_en.pdf packages_doc_0.6_ru.pdf 2 Quote Share this post Link to post Short link Share on other sites
jhakonen 0 #407577 Posted October 18, 2017 Awesome, thank you! Quote Share this post Link to post Short link Share on other sites
Pavel3333 1,148 #408237 Posted October 21, 2017 (edited) Мда, 6-й день мод проверялся и так и не проверился модератором. Видимо, не судьба. Пока проверялся, уже вышла новая версия мода) Ан нет, не заметил сообщения от модератора... Edited October 21, 2017 by Pavel3333 Quote Share this post Link to post Short link Share on other sites
Crus 11 #419740 Posted February 3, 2018 Цитата 6.4 Исполнение Python-кода После монтирования всех пакетов и разрешения конфликтов, происходит исполнение всех .pyc - файлов из каталога /scripts/client/gui/mods/ в алфавитном порядке, имя которых начинается с mod_ . Так текущее фактическое поведение, отличное от выделенного утверждения - это баг? Или просто данная часть документации устарела? Quote Share this post Link to post Short link Share on other sites
Polyacov_Yury 1,667 #419743 Posted February 4, 2018 2 часа назад, Crus сказал: Так текущее фактическое поведение, отличное от выделенного утверждения - это баг? Или просто данная часть документации устарела? И то, и другое. Старый алгоритм моды импортировал по несколько раз (от чего им, кстати, было ни жарко ни холодно, если только импорт не происходил под разными именами, что как раз имело место быть), причем под разными именами (например, если он пытался импортировать mod_CamoSelector и mod_camoselector - мод импортировался дважды). Теперь же список модов обернут в set(), что не явилось истинным решением проблемы (которая решилась тем, что все имена файлов подвергаются lower() перед обработкой), а только лишь сломало порядок инициализации модов. Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #419751 Posted February 4, 2018 2 hours ago, Polyacov_Yury said: Теперь же список модов обернут в set(), что не явилось истинным решением проблемы (которая решилась тем, что все имена файлов подвергаются lower() перед обработкой), а только лишь сломало порядок инициализации модов. Картошка как всегда. Вообще для этих целей существуют функции типа unique, различные варианты реализации которых можно без проблем найти в гугле. Не самый быстрый, но один из самых коротких вариантов. uniques = lambda entries: sorted(set(entries), key=entries.index) З.Ы. Я один не вкуриваю, какого **** *** *** в питоне нет built-in генератора unique по принципу того же reversed? Quote Share this post Link to post Short link Share on other sites
Polyacov_Yury 1,667 #419754 Posted February 4, 2018 2 часа назад, GPCracker сказал: Картошка как всегда. Вообще для этих целей существуют функции типа unique, различные варианты реализации которых можно без проблем найти в гугле. Не самый быстрый, но один из самых коротких вариантов. uniques = lambda entries: sorted(set(entries), key=entries.index) З.Ы. Я один не вкуриваю, какого **** *** *** в питоне нет built-in генератора unique по принципу того же reversed? Возможно - не смогли в. А насчет реализации - я тоже погуглил в свое время. Нам все же сортировать set() не надо - список и так отсортированный приходит. Загляни в PYmodsCore/utils.py, функция remDups(). Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #419761 Posted February 4, 2018 (edited) 3 hours ago, Polyacov_Yury said: Загляни в PYmodsCore/utils.py, функция remDups(). Юра, на номерах строк на GitHub есть ссылки, если что. И да, этот вариант я тоже видел, правда написан был чуть по-другому. Плюс того варианта, что привел я - он относительно короткий. Минусы - скорость. Варианты с добавлением с set или list быстрее, по крайней мере на небольших объемах данных. Нативный вариант реализации в виде генератора был бы существенно быстрее, особенно на больших объемах данных. В любом случае, похожий алгоритм используется при создании set. Почему его не добавили в питон, учитывая что это типовая и широко используемая функция - непонятно. Вы тут с пакетами модификаций играетесь, а я вот сижу лишние пакеты из системы вычищаю... Edited February 4, 2018 by GPCracker Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #419762 Posted February 4, 2018 (edited) 4 minutes ago, GPCracker said: Почему его не добавили в питон, учитывая что это типовая и широко используемая функция - непонятно. Вот да, в collections рядом с OrderedDict ей самое место. Да и классы для деревьев хотелось бы там видеть. Олимпиадное программирование сейчас не для питона, а жаль. Edited February 4, 2018 by SkepticalFox Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #419763 Posted February 4, 2018 1 minute ago, SkepticalFox said: Вот да, в collections рядом с OrderedDict ей самое место. Как по мне - рядом с reversed в built-in. Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #419764 Posted February 4, 2018 Just now, GPCracker said: Как по мне - рядом с reversed в built-in Я про OrderedSet, а не про unique 1 Quote Share this post Link to post Short link Share on other sites
Crus 11 #419812 Posted February 5, 2018 unique и OrderedSet - это конечно хорошо, но как помогло бы в данном случае? Ведь в сохранении исходного порядка элементов нет необходимости, требуется получить отсортированный по алфавиту список. Quote Share this post Link to post Short link Share on other sites
Polyacov_Yury 1,667 #419813 Posted February 5, 2018 20 минут назад, Crus сказал: unique и OrderedSet - это конечно хорошо, но как помогло бы в данном случае? Ведь в сохранении исходного порядка элементов нет необходимости, требуется получить отсортированный по алфавиту список. Суть в том, что ResMgr.openSection().keys() возвращает уже отсортированный список. Надо только дедупликацию провести без нарушения этой отсортированности. То есть дешевле будет сохранить текущий порядок, чем перемешать (set()), а потом отсортировать обратно. Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #419814 Posted February 5, 2018 4 minutes ago, Polyacov_Yury said: Надо только дедупликацию провести ... дешевле будет сохранить текущий порядок, чем перемешать (set()), а потом отсортировать обратно. Именно так. Сортировка занимает весьма приличное количество ресурсов. Хотя в данной ситуации это не особенно важно - здесь нет жестких требований по скорости работы алгоритма дедупликации. Quote Share this post Link to post Short link Share on other sites
Polyacov_Yury 1,667 #419815 Posted February 5, 2018 2 минуты назад, GPCracker сказал: Именно так. Сортировка занимает весьма приличное количество ресурсов. Хотя в данной ситуации это не особенно важно - здесь нет жестких требований по скорости работы алгоритма дедупликации. А главная хохма в том, что этот кусочек кода за все время работы клиента выполняется однократно, и массив там ну максимум сотня элементов (в среднем порядка пары десятков). Поэтому там даже если три раза перемешать, а потом пузырьком пересортировать - все равно никакого влияния на перфоманс не будет. 1 Quote Share this post Link to post Short link Share on other sites
Crus 11 #419818 Posted February 5, 2018 11 минут назад, Polyacov_Yury сказал: Суть в том, что ResMgr.openSection().keys() возвращает уже отсортированный список. Теперь понятно откуда обсуждение вариантов unique. На текущий момент ResMgr.openSection().keys() уже не возвращает отсортированный список. Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #419819 Posted February 5, 2018 Just now, Crus said: На текущий момент ResMgr.openSection().keys() уже не возвращает отсортированный список. А что именно возвращает? Пример есть? Я просто немного не на винде, но интересно же :) Quote Share this post Link to post Short link Share on other sites
Crus 11 #419825 Posted February 5, 2018 52 минуты назад, GPCracker сказал: А что именно возвращает? Пример есть? pprint.pprint(ResMgr.openSection('scripts\client\gui\mods').keys()) ['mod_pmod.pyc', 'mod_battlehits.pyc', 'mod_.py', 'mod_.pyc', 'mod_xfw_native.pyc', 'mod_pro_lasthits.pyc', 'mod_pro_reduced_armor.pyc', 'mod_safeshot.pyc', 'mod_pro_spotted.pyc', 'mod_wotxp.pyc', '__init__.pyc'] Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #419826 Posted February 5, 2018 (edited) @Crus, в этом порядке проглядывается некоторая логика, если сравнивать с выводом set для того же набора элементов... такое ощущение, что это list(set(keys))... или что-то подобное. Просто на разных версиях и других условиях это поведение, как и хэш-функция, на которой базируется set, скорее всего может несколько отличаться, т.к. оно не задокументировано, нужно смотреть исходники питона. Но вот насчет чего я точно уверен - так это в том, что картошка как всегда. Edited February 5, 2018 by GPCracker Quote Share this post Link to post Short link Share on other sites
Polyacov_Yury 1,667 #420550 Posted February 9, 2018 На бета-тесте 1.0 клиент отказывается импортировать pyc-скрипты из собранных через python пакетов. Причем сами пакеты читаются без ошибок, но при попытке импорта возникает ошибка: *** WARNING(scripts/client/gui/mods/__init__.py, 72): There is problem while import gui mod ('gui.mods', 'mod_example.pyc') *** EXCEPTION(scripts/client/gui/mods/__init__.py, 74): *** Traceback (most recent call last): *** File "scripts/client/gui/mods/__init__.py", line 67, in _findValidMODs *** File "scripts/common/Lib/importlib/__init__.py", line 37, in import_module *** ImportError: scripts/client/gui/mods/mod_example.pyc is not a valid Python compiled module file Если пакет собирать вручную архиватором или положить файлы не в пакет, а в res_mods - все работает. На текущем релизе (0.9.22.0) те же пакеты спокойно распознаются и импортируются. UPD. Почему-то при наличии чего бы то ни было в поле extra у ZipInfo какого-либо файла ломает этот самый файл (ResMgr просто игнорирует байт, в котором написана длина этого самого extra, и читает контент файла сразу после его имени, срезая вместо этого его данные в конце на то же число байт). Фикс для своего запаковщика сделал, остальным - иметь в виду. 1 Quote Share this post Link to post Short link Share on other sites