#python #python-3.x #python-3.6 #metaprogramming
#python #python-3.x #python-3.6 #метапрограммирование
Вопрос:
В Python я могу передать функцию в качестве параметра другой функции, т.Е.:
inspect.getmembers(random, callable)
Это дало бы мне все вызываемые члены random
переменной. И callable
— это функция, переданная для выполнения проверки (будут возвращены только члены переменной, удовлетворяющие проверке).
Мой конкретный вопрос заключается в том, как получить все не вызываемые аргументы и, в более широком смысле, есть ли способ передать «обратное» значение функции в качестве аргумента?
Я пробовал это:
inspect.getmembers(random, !callable)
inspect.getmembers(random, not callable)
И первое — это синтаксическая ошибка, в то время как второе не работает.
В качестве обходного пути я определил свою собственную функцию:
def uncallable(object)
return not callable(object)
И так это работает:
inspect.getmembers(random, uncallable)
Но мне интересно, есть ли более простое решение.
Комментарии:
1. «Проще», чем просто написать эту функцию? Сколько предикатов вам нужно? (Не совсем риторический; об этом стоит подумать.)
2. Вы можете использовать анонимную функцию:
inspect.getmembers(random, lambda x: not callable(x))
Ответ №1:
Просто используйте лямбда:
inspect.getmembers(random, lambda x: not callable(x))
Ответ №2:
Просто напишите свою не вызываемую оболочку.
Ни один язык, о котором я знаю, не допускает такой высокоуровневой функциональной арифметики, которую вы ожидаете.
Нет способа заставить такую концепцию работать в целом.
Какова результирующая функция из них: ?
! len
len len
len ! len
Итак, у нас остались явно написанные функции высокого порядка, функции akka, которые принимают функции в качестве параметров и возвращают другие функции, подобные этой
def negate(func):
def wrapped(*args, **kwargs):
return not func(*args, **kwargs)
return wrapped
uncallable = negate(callable)
Это тот же шаблон, что и у декораторов Python.