проблема реализации в методе run_keyword в пользовательском ключевом слове каркаса робота с использованием динамической библиотеки - PullRequest
2 голосов
/ 19 марта 2019

Я изучаю реализацию динамической библиотеки в среде роботов с использованием Python. В этом процессе я создал новое ключевое слово с использованием динамической библиотеки, как описано в этой ссылке.

Исходный код приведен ниже

import logging


class libdynamicsampl1:
    def get_keyword_names(self):
        return ["methOne", "methTwo"]

    def methOne(self):
        logging.info("called the methone")

    def methTwo(self, name):
        logging.info("called the methtwo with the arg as" + name)

    def run_keyword(self, name, args):
        print "Running keyword '%s' with arguments %s." % (name, args)
        methArgs = (self,) + (args)
        return getattr(self, name, methArgs)()

Когда я запускаю это ключевое слово из файла робота, как показано в приведенном ниже коде,

*** Test Cases ***
Log Dynamic Test Library
    Invoke dyn tests no arg
    Invoke dyn tests with arg

*** Keywords ***
Invoke dyn tests no arg
    meth one

Invoke dyn tests with arg
    meth two    "welcome to awesome robot framework"

Есть ошибка, подобная приведенной ниже, вывод заключается в том, что methTwo принимает «self» и «name», но использование getattr (...) передает только предполагаемое имя.

TypeError: methTwo () принимает ровно 2 аргумента (1 дано)

Пожалуйста, помогите исправить эту проблему или предложите лучшую практику / реализацию о том, как вызывать методы, основанные на входных аргументах. Образца с сайта фреймворка робота не существует, поэтому любое исправление будет очень полезным.

Приведенная ниже реализация в методе run_keyword работает нормально, но я чувствую, что это не лучшая практика для реализации в готовой кодовой базе.

def run_keyword(self, name, args):
    print "Running keyword '%s' with arguments %s." % (name, args)
    if name == "methOne":
        return self.methOne()
    if name == "methTwo":
        return self.methTwo(args[0])

1 Ответ

2 голосов
/ 20 марта 2019

с использованием 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...