机器人框架:无法使用 __eq__ 方法从类中获取关键字

Posted

技术标签:

【中文标题】机器人框架:无法使用 __eq__ 方法从类中获取关键字【英文标题】:Robot Framework : Unable to get keywords from class with __eq__ method 【发布时间】:2017-11-01 23:27:53 【问题描述】:

如果python类包含__eq__方法,机器人框架无法从类中获取关键字(如果__eq__方法被注释掉,测试运行并通过)。例如,如果我的 Python 类(在 TestClass.py 中实现)是

class TestClass(object):
    def __init__(self, arg1, arg2):
        self.arg1 = arg1
        self.arg2 = arg2

    def get_arg1(self):
        return self.arg1

    def get_arg2(self):
        return self.arg2

    def __eq__(self, other):
        return self.arg1 == other.arg1 and self.arg2 == other.arg2

我的机器人文件 (TestClass.robot) 是

*** Settings ***
Library    TestClass    1    2    WITH NAME    First_Lib

*** Variables ***

*** Test Cases ***
MyTest1
    $result=    First_Lib.get arg1
    Should be equal as integers    $result    1
MyTest2
    $result=    First_Lib.get arg2
    Should be equal as integers    $result    2

我在运行 robot v3.0.2 时看到以下错误消息。

[ ERROR ] Error in file 'TestClass.robot': Getting keyword names from library 'TestClass' failed: AttributeError: type object 'object' has no attribute 'arg1'

我想了解这是否是对机器人框架的不支持使用,如果是,是否有推荐的解决方案来重写/修改被测类以避免此错误。

通过调试器执行机器人框架代码,我看到错误源自类_ClassLibrary中的方法_get_handler_method(在文件testlibraries .py)。作为机器人框架的新手,我不知道如何解决这个问题。

任何建议都会有很大帮助!!

【问题讨论】:

【参考方案1】:

您的__eq__ 方法有问题。您的实现假定一个实例只会与另一个实例进行比较,但它可以与任何东西进行比较。例如,如果您将实例与字符串进行比较,您的函数将抛出错误,因为字符串没有arg1 属性。

一个简单的解决方法是检查两个对象是否属于同一类型,此外还要检查它们的属性:

def __eq__(self, other):
    return (isinstance(other, self.__class__) and
            self.arg1 == other.arg1 and
            self.arg2 == other.arg2)

【讨论】:

解决了这个问题..谢谢

以上是关于机器人框架:无法使用 __eq__ 方法从类中获取关键字的主要内容,如果未能解决你的问题,请参考以下文章

无法从类内部调用 ExtJS 类中的方法

我的函数独立工作,但不能从类中调用

为啥 Python 有一个 __ne__ 运算符方法而不仅仅是 __eq__?

python--定义实例方法

Python面向对象-方法

Cython 元类 .pxd:我应该如何实现 `__eq__()`?