Есть ли Python эквивалентный Ruby's response_to? - PullRequest
11 голосов
/ 22 мая 2011

Есть ли способ узнать, отвечает ли класс методу в Python? как в рубине:

class Fun
  def hello
    puts 'Hello'
  end
end

fun = Fun.new
puts fun.respond_to? 'hello' # true

Также есть ли способ узнать, сколько аргументов требует метод?

Ответы [ 4 ]

17 голосов
/ 22 мая 2011

Хммм .... Я думаю, что hasattr и callable будет самым простым способом достижения той же цели:

class Fun:
    def hello(self):
        print 'Hello'

hasattr(Fun, 'hello')   # -> True
callable(Fun.hello)     # -> True

Конечно, вы можете позвонить callable(Fun.hello) из набора обработки исключений:

try:
    callable(Fun.goodbye)
except AttributeError, e:
    return False

Что касается самоанализа на количество требуемых аргументов; Я думаю, что это будет иметь сомнительную ценность для языка (даже если он существует в Python), потому что это ничего не скажет вам о требуемой семантике. Учитывая простоту, с которой можно определять необязательные / заданные по умолчанию аргументы, а также функции и методы переменных аргументов в Python, кажется, что знание «необходимого» количества аргументов для функции будет иметь очень небольшое значение (с программной / интроспективной точки зрения).

8 голосов
/ 22 мая 2011

Имеет метод:

func = getattr(Fun, "hello", None)
if callable(func):
  ...

Арность:

import inspect
args, varargs, varkw, defaults = inspect.getargspec(Fun.hello)
arity = len(args)

Обратите внимание, что арность может быть практически любой, если у вас varargs и / или varkw нет None.

2 голосов
/ 22 мая 2011

dir(instance) возвращает список атрибутов объектов.
getattr(instance,"attr") возвращает атрибут объекта.
callable(x) возвращает True, если x вызывается.

class Fun(object):
    def hello(self):
        print "Hello"

f = Fun()
callable(getattr(f,'hello'))
1 голос
/ 22 мая 2011

Я не эксперт по Ruby, поэтому не уверен, что это ответит на ваш вопрос. Я думаю, что вы хотите проверить, если объект содержит метод. Есть множество способов сделать это. Вы можете попробовать использовать функцию hasattr(), чтобы проверить, имеет ли объект метод:

hasattr(fun, "hello") #True

Или вы можете следовать правилам Python не спрашивать, просто спросить , поэтому просто поймайте исключение, которое выдается, когда у объекта нет метода:

try:
    fun.hello2()
except AttributeError:
    print("fun does not have the attribute hello2")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...