Есть ли эквивалент Python для Ruby reply_to?

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

class Fun
  def hello
    puts 'Hello'
  end
end

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

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

Ответ 1

Хммм.... Я бы подумал, что 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, кажется, что знание "требуемого" количества аргументов для функции было бы очень мало (с программной/интроспективной перспективы).

Ответ 2

Имеет метод:

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

Arity:

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

Обратите внимание, что arity может быть почти что угодно, если у вас есть varargs и/или varkw not None.

Ответ 3

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

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

f = Fun()
callable(getattr(f,'hello'))

Ответ 4

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

hasattr(fun, "hello") #True

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

try:
    fun.hello2()
except AttributeError:
    print("fun does not have the attribute hello2")