с использованием getattr (...) передает только предполагаемое имя.
Это зависит от того, как вы определяете «только имя».getattr
вернет функцию, она ничего не знает о аргументах функции.Однако возвращаемая функция будет методом объекта, поэтому вам не нужно беспокоиться о передаче параметра self
.
Рассмотрите этот код:
return getattr(self, name, methArgs)()
Itсовпадает с этим кодом (при условии, что name
является допустимым именем метода)
func = getattr(self, name, methArgs)
func()
Если на данный момент getAttr
возвращает self.methTwo
, приведенный выше код идентичен этому:
self.methTwo()
Обратите внимание, что в приведенном выше коде не передается никаких аргументов.При использовании в getattr
эта переменная не представляет аргументы, она представляет имя метода по умолчанию на случай, если запрошенная не существует.Другими словами, когда name
является действительным, getattr
будет просто игнорировать methArgs
.
Поскольку один из ваших методов ожидает аргумент (name
), вы получите ошибку, которую он не сделал 'получить все аргументы, которые он ожидал.Видимо, именно это и произошло.
Есть и другие проблемы с вашим примером, поэтому я не могу быть уверен в точном решении.Непонятно, если вы ожидаете, что meth one
в тесте вызовет methOne
, или meth one
или methOne
- опечатка.
Если вы используете правильное имя в обоих местах, вы можете напрямуюпреобразуйте имя в метод с помощью getattr, аналогично тому, как вы это делаете сейчас.Разница лишь в том, что вам нужно передавать аргументы в функцию, а не getattr
.
Например, учитывая этот фрагмент кода робота:
Invoke dyn tests with arg
methTwo "welcome to awesome robot framework"
Вот какреализовать run_keyword
, чтобы этот код робота работал:
def run_keyword(self, name, args):
print "Running keyword '%s' with arguments %s." % (name, args)
func = getattr(self, name)
return func(*args)