Как я могу скрыть несовместимый код из старых версий Python? - PullRequest
3 голосов
/ 23 августа 2009

Я пишу модульные тесты для функции, которая принимает аргументы *args и **kwargs. Разумный вариант использования этой функции - использование аргументов с ключевыми словами после аргумента *args, т.е. в форме

def f(a, *b, **c):
    print a, b, c

f(1, *(2, 3, 4), keyword=13)

Теперь это только стало легальным в Python 2.6 ; в более ранних версиях приведенная выше строка является синтаксической ошибкой, поэтому она даже не будет компилироваться в байт-код.

Мой вопрос: Как я могу проверить функциональность, предоставляемую в более новой версии Python, и при этом запустить тесты для более старых версий Python?

Я должен отметить, что сама функция отлично работает для более ранних версий Python, только некоторые вызовы являются синтаксическими ошибками до Python 2.6. Различные методы проверки версии Python, которые я видел, не работают для этого, поскольку они не проходят стадию компиляции.

Я бы предпочел не разбивать тесты на несколько файлов, если это вообще возможно.

Ответы [ 3 ]

11 голосов
/ 23 августа 2009

Я не думаю, что вы должны проверять, правильно ли работает Python; вместо этого сосредоточьтесь на тестировании своего собственного кода. При этом вполне возможно написать конкретный вызов так, чтобы он работал для всех версий Python, а именно:

f(1, *(2,3,4), **{'keyword':13})
2 голосов
/ 23 августа 2009

Одним из подходов может быть использование eval() или exec вместе с тестом для текущей версии Python. Это откладывает компиляцию на время выполнения, где вы можете контролировать, происходит ли на самом деле компиляция или нет.

1 голос
/ 23 августа 2009

Почему вы хотите использовать такой синтаксис? Я имею в виду, что эта функция 2.6 не дает никаких реальных преимуществ, кроме ярлыков.

a = [2,3,4]
a.insert(0, 1)
kw = {'keyword'='test'}
f(*a, **kw)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...