Передать отрицательную функцию как n аргумент

#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.