Какое встроенное имя типа функции в Python? - PullRequest
0 голосов
/ 17 сентября 2009

Что возвращает встроенный Python <type 'function'>?

>>> type(lambda: None)
<type 'function'>

Есть ли способ избежать создания этой лямбда-функции, чтобы получить тип функций в целом?

Подробнее см. http://www.finalcog.com/python-memoise-memoize-function-type.

Спасибо

Крис.

Ответы [ 4 ]

5 голосов
/ 17 сентября 2009

Вы должны иметь возможность использовать types.FunctionType, чтобы делать то, что вы хотите:

    Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51) 
    [GCC 4.2.1 (Apple Inc. build 5646)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import types
    >>> help(types.FunctionType)

    Help on class function in module __builtin__:

    class function(object)
     |  function(code, globals[, name[, argdefs[, closure]]])
     |  
     |  Create a function object from a code object and a dictionary.
     |  The optional name string overrides the name from the code object.
     |  The optional argdefs tuple specifies the default argument values.
     |  The optional closure tuple supplies the bindings for free variables.

Но обычно def считается конструктором по умолчанию для типа function.

3 голосов
/ 17 сентября 2009

Вам следует отказаться от идеи типов в Python. Большую часть времени вы не хотите проверять «тип» чего-либо. Явная проверка типов склонна к поломке, например:

>>> s1 = 'hello'
>>> s2 = u'hello'
>>> type(s1) == type(s2)
False

Что вы хотите сделать, это проверить, поддерживает ли объект какую-либо операцию, которую вы пытаетесь выполнить над ним.

Если вы хотите увидеть, является ли данный объект функцией, сделайте следующее:

>>> func = lambda x: x*2
>>> something_else = 'not callable'
>>> callable(func)
True
>>> callable(something_else)
False

Или просто попробуйте позвонить и поймайте исключение!

1 голос
/ 17 сентября 2009

"Что возвращает встроенный Python <type 'function'>?"

Функция.

"Есть ли способ избежать создания этой лямбда-функции, чтобы получить тип функций в целом?"

Да, types.FunctionType. или просто наберите (любая функция)

Если вы спрашиваете, как избавиться от лямбд (но перечитывание говорит, что вы, вероятно, нет), вы можете определить функцию вместо лямбды.

Так что вместо:

>>> somemethod(lambda x: x+x)

Вы делаете

>>> def thefunction(x):
...     return x+x
>>> somemethod(thefunction)
0 голосов
/ 17 сентября 2009

встроенные модули не function s, а: builtin_function_or_method. Не в этом ли смысл именования?

Вы можете получить что-то вроде:

>>> type(len)
<class 'builtin_function_or_method'>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...