Я думаю, что тема звучит довольно глупо, поэтому я покажу код:
def foo(**kwargs):
# How can you detect the difference between (**{}) and ()?
pass
foo(**{})
foo()
Есть ли способ обнаружить внутри foo, как этот метод вызывался?
Обновление 1
Поскольку были некоторые комментарии, почему вы можете захотеть что-то сделать, я попытаюсь объяснить некоторую предысторию.
super(MyClass, self).foo(*args, **kwargs)
отстой - много расточительного дублирования. Я хочу написать 'self.super ()'. В этом случае просто вызовите суперкласс и передайте все параметры, которые получил вызывающий метод. Работает как шарм.
Теперь проблемная магическая часть:
Я хочу сказать «self.super (что-то)», и в этом случае только «что-то» передается методу super. Работает для большинства случаев.
Вот где он ломается:
def foo(self, fnord=42, *args, **kwargs):
self.super(*args, **kwargs)
Таким образом, супер метод должен получить аргументы, которые вызывает метод - однако если *args
, **kwargs
пустые, в настоящее время библиотека не может обнаружить это условие и передала все аргументы, включая 'fnord' ...
Конечно, я мог бы использовать self.super.foo(*args, **kwargs)
в качестве альтернативного синтаксиса, но это плохо: -)
PS: Да, я знаю, что p3k супер, но все же не очень хорошо, и он не работает с Python 2.x ...
Обновление 2
На самом деле даже модуль Ast Python удаляет **{}
(ast.parse('foo(**{})')
), поэтому похоже, что это происходит на раннем этапе процесса синтаксического анализа, и вы не сможете получить эту информацию позже ...
Итак, в конце я должен либо отказаться от этой конкретной проблемы (вызывая AmbiguousSyntaxError), либо использовать синтаксический анализ текста, предложенный ~ unutbu. Переосмысливая мой подход, последний может на самом деле осуществиться, потому что мне нужно только знать, если это self.super(\s*)
, self.super(\S+)
.