2016-03-23 3 views
3

Я использую свою собственную функцию python в Robot Framework. Я даю 3 параметра, эти параметры являются переменными Robot Framework. Когда я изменяю переменные в своей функции, он не изменяется в Robot Framework. Поэтому я выводя, что переменные передаются по значению, а не по ссылке ... Есть ли способ передать переменную по ссылке? Или же вернуть в результате 3 переменные?Передача переменной робота по ссылке на функцию python

Вот пример Robot Framework код:

** 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} 

С моей питона библиотеки:

import sys 

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

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

Но, как я сказал, переменная переменная остается "AZERTY", когда я вхожу, и Я бы хотел, чтобы второй журнал печатал «другое значение» (поскольку функция должна изменить значение)

Благодарим за помощь!

ответ

0

var в вашем коде на языке python является локальной переменной.

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" 

Это должно изменить глобальную переменную в строку другого значения.

+0

Хорошо, я понимаю, но как это может быть сделано в рамках кода робота? –

+0

вам не нужно менять код Robot Framework, если вы следуете совету Headhunter, используйте существующий код рамки робота, но измените свой код на Python. – shicky

3

Все значения по существу передаются по ссылке. Если вы измените значение, вы меняете его повсюду, но если вы назначаете другое значение переменной, вы просто делаете эту переменную точкой с другим значением, не изменяя исходное значение.

Например:

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 не изменяется. d - локальная переменная внутри foo, и она заменяется на новый словарь вместо my_dict.

Вы также должны знать, что в Python, у вас есть изменяемых и неизменных значения. Например, строки: неизменяемые. Вы никогда не сможете изменить строку, вы можете использовать только строку для создания новых строк (и часто вы будете возвращать эти новые значения к одной и той же переменной, чтобы она имела аналогичный эффект); имеющий побочный эффект функции, изменяя одно из значений, которые передаются, может работать только в том случае, если они являются изменяемыми значениями.

Как правило, это плохая идея для ваших функций изменять свои аргументы. Лучший подход - это вернуть им новые значения, которые вызывающий может делать с тем, с чем они хотят.

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" 
+0

Подводя итог, сделайте так, чтобы Spoonmeiser предлагал и добавлял 'return var' в' myFunction' и менял ваш RF-код, чтобы переназначить '$ {var} = myFunction ...' – MarkHu

Смежные вопросы