Проверка совместимости двух функций (или методов) Python - PullRequest
2 голосов
/ 20 июня 2009

Есть ли возможность проверить, являются ли две функции python взаимозаменяемыми? Например, если у меня есть

def foo(a, b):
    pass
def bar(x, y):
    pass
def baz(x,y,z):
    pass

Я бы хотел функцию is_compatible(a,b), которая возвращает True при передаче foo и bar, но False при передаче bar и baz, так что я могу проверить, являются ли они взаимозаменяемыми, прежде чем фактически вызывать любой из них.

Ответы [ 2 ]

4 голосов
/ 20 июня 2009

На чем бы вы основывали совместимость? Количество аргументов? Python имеет списки аргументов переменной длины, поэтому вы никогда не знаете, совместимы ли две функции в этом смысле. Типы данных? Python использует утку, поэтому до тех пор, пока вы не используете в функции тест isinstance или аналогичный, нет ограничений на типы данных, на которых может основываться тест на совместимость.

Итак, вкратце: Нет.

Вам лучше написать хорошие строки документации, чтобы любой пользователь вашего API знал, что должна делать функция, которую он дает вам, а затем вы должны верить, что полученная функция ведет себя правильно. Любая проверка «совместимости» либо исключает возможные допустимые функции, либо дает ложное представление о том, что «все точно так, как должно быть».

Питонический способ разоблачения API: написать хорошую документацию, чтобы люди знали, что им нужно знать, и верили, что они поступают правильно. На критических позициях вы все еще можете использовать try: except:, но всем, кто неправильно использует ваш API, потому что им просто не хотелось читать документ, не следует давать ложное чувство безопасности. И тот, кто действительно прочитал ваш документ и хочет использовать его полностью приемлемым образом, не должен лишаться возможности использовать его на основании того, как он объявил функцию.

3 голосов
/ 20 июня 2009

Взгляните на inspect.getargspec():

inspect.getargspec(func)

Получить имена и значения по умолчанию функции аргументы. Кортеж из четырех вещей возвращено: (args, varargs, varkw, по умолчанию) . args это список имена аргументов (может содержать вложенные списки). Varargs и Varkw являются имена аргументов * и ** или Никто. по умолчанию это кортеж по умолчанию значения аргумента или None, если есть нет аргументов по умолчанию; если этот кортеж имеет n элементов, они соответствуют последние n элементов перечислены в аргументах.

Изменено в версии 2.6: Возвращает именованный кортеж ArgSpec (args, varargs, ключевые слова, по умолчанию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...