Несмотря на то, что форматирование, скорее всего, имеет большую часть Pythonic, это альтернативное решение, использующее инструмент more_itertools.rstrip
.
import more_itertools as mit
def fmt(num, pred=None):
iterable = str(num)
predicate = pred if pred is not None else lambda x: x in {".", "0"}
return "".join(mit.rstrip(iterable, predicate))
assert fmt(3) == "3"
assert fmt(3.) == "3"
assert fmt(3.0) == "3"
assert fmt(3.1) == "3.1"
assert fmt(3.14) == "3.14"
assert fmt(3.140) == "3.14"
assert fmt(3.14000) == "3.14"
assert fmt("3,0", pred=lambda x: x in set(",0")) == "3"
Число преобразуется в строку, которая лишен завершающих символов, которые удовлетворяют предикату. Определение функции fmt
не требуется, но оно используется здесь для проверки утверждений, которые все проходят. Примечание: он работает с строковыми вводами и принимает необязательные предикаты.
См. Также подробную информацию об этой сторонней библиотеке, more_itertools
.
Я разобрался, и это не очень сложно, но есть несколько моментов.
В принципе, вы можете использовать скрипт генерирующий зависимости calcdeps.py (вы должны прочитать calcdeps.py docs) в одном из нескольких режимов:
Для разработки следует использовать (1), так как это позволяет не запускать calcdeps.py после редактирования исходников JS, если только вы не внесете изменения в дерево зависимостей. Остальной ответ на этот вопрос, я еще не пробовал другой.
Вот что я сделал, чтобы сгенерировать его:
#!/bin/bash
cd closure-library/closure/goog
python ../bin/calcdeps.py -p ../../../js -o deps > ../../../my-deps.js
...предполагая следующую структуру каталога:
project/
closure-library/ (as checked out from SVN)
js/ (my JS code)
app.html
(параметр -p
обходит все js файлы в указанном каталоге, а в документации сказано, что при необходимости можно указать несколько каталогов для поиска)
Вышеуказанный вызов создает файл my-deps.js рядом с основным приложением.html, который я использую для запуска приложения. Созданный файл содержит информацию о моих JS файлах в js/
и выглядит следующим образом:
goog.addDependency('../../../js/controllers.js', ['proj.controllers'], []);
goog.addDependency('../../../js/ui.js', ['proj.ui'], ['proj.controllers']);
- где первая строка это путь к моему JS файлу относительно close-library/closure/goog/base. js (это важно!), второй массив - это список строк goog.provide
-d, а последний массив - это список строк goog.require
-d.
Now in app. html У меня есть:
<script src="closure-library/closure/goog/base.js"></script>
<script src="my-deps.js"></script>
<script>
goog.require("proj.ui");
</script>
<script>
// here we can use the required objects
</script>
Примечание:
. require
должен быть в отдельном теге сценария, потому что он добавляет тег сценария для загрузки требуемых сценариев, и они загружаются после завершения обработки текущего тега сценария.Gotchas:
goog.require
создает загружаемый URL скрипта, объединяя базовый URL base.js (т.е. без имени листа base.js), и первый параметр goog.addDependency в deps.js. Мне удалось заставить его работать, добавив следующее в deps. js
:
goog.addDependency ('../../../ foo / bar.js', ['foo.bar'], []);
Firefox теперь отправляет http-запрос на / foo / bar.js
, когда он встречает оператор goog.requires
.
Однако файл содержит этот комментарий:
// Этот файл был автоматически создан GenJsDeps, пожалуйста, не редактируйте.
Согласно это , GenJsDeps
то же самое, что calcdeps.py
. Если вы посмотрите документацию, похоже, что есть переключатель -o deps
, который повторно генерирует deps.js
, поэтому он не редактируется вручную.
Да, вы должны использовать calcdepds.py. Я создал большой пост в блоге после множества проб и ошибок, чтобы найти лучший способ сделать это, я также просмотрел различия между dojo.require и goog.require:
Вот небольшой проект, над которым я работал и который может быть вам полезен: http://github.com/fintler/lanyard
Взгляните на build.xml, файл lanyard.js и все файлы, расположенные в src / geom / *.
В build.xml есть пример вызова calcdeps.py через ant для всех js, расположенных в src. Возможно, это не лучший способ делать что-то, но до сих пор он работал у меня.
Обновление!!!
Новая версия calcdeps.py немного меняет игру. Для создания вашего deps.js теперь нужно использовать флаг -d. Например:
python path-to-closure-library/closure/bin/calcdeps.py -i path-to-your-src/requirements.js -o deps -d path-to-closure-library/closure/ -p path-to-your-src/ --output_file=path-to-your-src/deps.js
Для компиляции:
python path-to-closure-library/closure/bin/calcdeps.py -i path-to-your-src/requirements.js -d path-to-closure-library/closure/ -p ./ --output_file=path-to-your-release/scripts.min.js -c path-to-compiler/compiler.jar -f "--compilation_level=ADVANCED_OPTIMIZATIONS" -f "--debug=true" -f "--process_closure_primitives=true" -f "--manage_closure_dependencies=true" -o compiled
Так что процесс стал намного проще, но вам придется использовать свои способности ESP, чтобы узнать об этом, так как это совершенно недокументировано. calcdeps.py теперь также не работает с Python 3.1 на windows, что также доставляет массу удовольствия. Несколько хаков заставили его работать для меня (которые я не буду приводить здесь, так как я не программист python и наверняка есть лучшие способы сделать это).
В общем, последний день был очень веселым, надеюсь, этот пост поможет кому-то избежать такого же удовольствия.
Guido