Если бы мне пришлось указать на одну большую трудность при создании Python RSpec, это было бы отсутствие хорошего синтаксиса в Python для создания анонимных функций (как в JavaScript) или блоков (как в Ruby). Единственный вариант для программиста на Python - это использовать лямбда-выражения, что совсем не так, потому что лямбда-выражения принимают только одно выражение. Блоки do ... end
, используемые в RSpec, должны быть записаны как функция перед вызовом describe
и it
, как в примере ниже:
def should_do_stuff():
# ...
it("should do stuff", should_do_stuff)
Не так сексуально, правда?
Существуют некоторые трудности при создании методов should
, но я уверен, что это будет меньшей проблемой. На самом деле, даже не нужно использовать такой необычный синтаксис - вы можете получить аналогичные результаты (возможно, даже лучше, в зависимости от вашего вкуса), используя синтаксис Jasmine , который может быть реализован тривиально.
Тем не менее, я чувствую, что синтаксис Python больше ориентирован на эффективное представление обычных компонентов программы, таких как классы, функции, переменные и т. Д. Он не очень подходит для расширения. Я, например, думаю, что хорошая программа на Python - это та, в которой я могу видеть объекты, функции и переменные, и я понимаю, что делает каждый из этих элементов. Программисты Ruby, OTOH, похоже, ищут более похожий на прозу стиль, где новый язык определен для новой проблемы. Это тоже хороший способ делать вещи, но не Pythonic. Python хорош для представления алгоритмов, а не прозы.
Иногда это суровый предел. Как можно использовать BDD например? Ну, обычный способ раздвинуть эти ограничения в Python - это эффективно написать свой собственный DSL, но он действительно должен быть другим языком. Вот, например, Pyccuracy : другой язык для BDD. Более распространенный пример - doctest . (На самом деле, если бы я написал некоторую библиотеку BDD Python, я бы написал ее на основе doctest.) Другой пример Python DSL - Twill . И еще один пример - reStructuredText , используемый в Sphinx .
Подводя итог: ИМХО самым сложным барьером для DSL в Python является отсутствие гибкого синтаксиса для создания анонимных функций. И это не ошибка *: Python в любом случае не любит тщательно изучать свой синтаксис - считается, что он делает код менее понятным во вселенной Python. Если вам нужен новый синтаксис в Python, советуем вам написать свой собственный язык, или, по крайней мере, так я чувствую.
* Или, может быть, я должен признаться, что мне не хватает анонимных функций. Тем не менее, я признаю, что их будет сложно реализовать элегантно, учитывая семантические отступы Python.