【问题标题】:Pass a robot variable by reference to a python function通过引用 python 函数传递机器人变量
【发布时间】:2016-03-23 13:35:46
【问题描述】:

我在 Robot Framework 中使用我自己的 python 函数。我给出了 3 个参数,这些参数是 Robot Framework 变量。当我修改函数中的变量时,它不会在 Robot Framework 中修改。所以我推断变量是通过值而不是通过引用传递的......有没有办法通过引用传递变量?或者返回 3 个变量作为结果?

这是一个机器人框架代码示例:

** Settings ***
 Library    OperatingSystem
 Library    myLib.MyLib    WITH NAME    MyLib

 Suite TearDown  teardown
 ** Variables **
 ${var}  azerty

 ** Test Cases **
 My test case
         log     ${var}
         myFunction    ${var}
         log     ${var}

使用我的 python 库:

import sys

 class MyLib(object):
     def __init__(self):
         return

     def myFunction(self,var):
         var="another value"

但正如我所说,当我记录变量 var 时它仍然是“azerty”,我希望第二个日志打印“另一个值”(因为函数应该更改值)

感谢您的帮助!

【问题讨论】:

    标签: python frameworks robotframework


    【解决方案1】:

    所有值本质上都是通过引用传递的。如果你改变了值,你会在任何地方改变它,但是如果你给变量分配一个不同的值,你只是让这个变量指向一个不同的值,而不是改变原来的值。

    例如:

    def foo(d):
        d['bar'] = 'baz'
    my_dict = {}
    foo(my_dict)
    

    这里,my_dict 将被更改为调用foo(my_dict) 的副作用。

    但是:

    def foo(d):
        d = {'foo': 'bar'}
    my_dict = {}
    foo(my_dict)
    

    这里,my_dict 没有改变。 dfoo 内部的一个局部变量,它被改为指向一个新的字典而不是my_dict

    您还需要注意,在 python 中,您有 mutableimmutable 值。例如,字符串是不可变的。您将永远无法更改字符串,您只能使用字符串来构造新字符串(并且通常您会将这些新值分配回同一个变量,因此它会产生类似的效果);函数的副作用是更改传入的值之一只有在它们是可变值时才有效。

    虽然你的函数改变它们的参数通常是一个坏主意。更好的方法是让它们返回新的值,然后调用者可以做他们想做的事情。

    def myFunction(self, var):
        var = "another value" # I assume that another values is based somehow on the original
        return var
    

    或者,您可以在类中使用属​​性:

    class MyLib(object):
        def __init__(self):
            self.var = "initial value"
        def myFunction(self):
            self.var = "another value"
    

    【讨论】:

    • 总而言之,按照 Spoonmeiser 的建议,将 return var 添加到 myFunction 并更改您的 RF 代码以重新分配 ${var} = myFunction ...
    【解决方案2】:

    python 代码中的 var 是一个局部变量。

    import sys
    
    class MyLib(object):
       def __init__(self):
           return
    
       def myFunction(self,var):
           var="another value"
    

    这为 myfunction 范围内的变量提供了名称 var 并防止读取全局变量。 如果你想让一个函数改变一个全局变量,你需要在作用域中声明一个全局变量。 像这样:

    import sys
    
    class MyLib(object):
       def __init__(self):
           return
    
       def myFunction(self,var):
           global var
           var="another value"
    

    这应该将全局变量更改为另一个值字符串。

    【讨论】:

    • 好的我明白了,但是如何在机器人框架代码中完成呢?
    • 如果您遵循猎头公司的建议,则无需更改机器人框架代码,使用您现有的机器人框架代码但更改您的 python 代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 2019-07-30
    相关资源
    最近更新 更多