2013-11-25 2 views
0

Скажем, у меня есть функция:функция вызова python с только необходимыми параметрами?

def omni(self, func, *args, **kwargs): 

, который всегда вызывает func.

Однако параметры func могут быть любой комбинацией вещей. Например

def func(self): 
    # omni should only pass in self 

def func(): 
    # omni should pass in nothing 

def func(foo, key='foo'): 
    # omni should pass in a foo param and a key if supplied one 

def func(*args, **kwargs): 
    # omni should pass in everything 

Есть ли способ, чтобы перейти в func из omni только необходимые параметры? то есть возможно выше?

ex.

def foo(m): 
    pass 

obj.omni(foo, m, a=1) 
# this should call 
foo(m) 

def foo(self, **kwargs): 
    pass 

obj.omni(foo, m, 1, b=2) 
# this should call 
foo(self, b=2) 
+0

Почему первый параметр является «самостоятельным»? Является ли это частью класса? Будет ли параметр 'func' также быть функцией-членом этого класса? – itsadok

ответ

0
def omni(self=None, func=None, *args=None, **kwargs=None) 

Вы должны использовать необязательные аргументы, как указано выше. Пожалуйста, смотрите здесь http://www.diveintopython.net/power_of_introspection/optional_arguments.html.

+0

Что означает '* args = None, ** kwargs = None' и как оно работает? – glglgl

+1

'* args = None' и' ** kwargs = None' - это нонсенс, и он вызывает SyntaxError. Если другие аргументы не заданы, 'args' is'() '. Если других аргументов ключевого слова не задано, 'kwargs' является' {} '. – Vincent

+0

@glglgl * args = None означает, что аргумент * args не имеет значения, если вызывающий объект функции не предоставит его. – Christos

0

Это звучит сложно.

Вам необходимо изучить func, а в случае, если func - это объект, func.__call__.

Реальная функция имеет func_defaults и func_code, последний, в свою очередь, имеет co_argcount и co_flags.

С их помощью вы можете проверить

  • сколько параметров функции имеет
  • , сколько из них имеют значения по умолчанию и
  • если *args/**kwargs допускается.
Смежные вопросы