2016-03-23 19 views
3

Ich verwende meine eigene Python-Funktion in Robot Framework. Ich gebe 3 Parameter, diese Parameter sind Robot Framework Variablen. Wenn ich die Variablen in meiner Funktion ändere, wird sie in Robot Framework nicht geändert. Daraus folge ich, dass die Variablen nach Wert und nicht nach Referenz übergeben werden ... Gibt es eine Möglichkeit, die Variable als Referenz zu übergeben? Oder sonst die 3 Variablen als Ergebnis zurückgeben? HierÜbergeben Sie eine Robotervariable durch Verweis auf eine Python-Funktion

ist ein Beispiel für Robot Framework-Code:

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

Mit meiner Python-Bibliothek:

import sys 

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

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

Aber wie gesagt, die Variable var bleibt "azerty" wenn ich es einzuloggen, und Ich möchte, dass das zweite Protokoll "einen anderen Wert" ausgibt (da die Funktion den Wert ändern sollte)

Vielen Dank für Ihre Hilfe!

Antwort

0

Die Variable in Ihrem Python-Code ist eine lokale Variable.

import sys 

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

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

Dies gibt eine Variable in der MyFunction Bereich den Namen var und verhindert, dass die globale Variable gelesen wird. Wenn Sie möchten, dass eine Funktion eine globale Variable ändert, müssen Sie sie im Bereich als globale Variable deklarieren. wie folgt aus:

import sys 

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

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

Dies sollte die globale Variable in den String ein anderer Wert ändern.

+0

Ok verstehe ich, aber wie kann es in dem Robot Framework Code getan werden? –

+0

Sie müssen den Robot Framework-Code nicht ändern, wenn Sie den Ratschlägen von Headhunter folgen, Ihren vorhandenen Roboter-Framework-Code verwenden, aber Ihren Python-Code ändern. – shicky

3

Alle Werte werden im Wesentlichen als Referenz übergeben. Wenn Sie den Wert ändern, ändern Sie ihn überall. Wenn Sie der Variablen jedoch einen anderen Wert zuweisen, wird dieser variable Punkt einfach auf einen anderen Wert gesetzt, und der ursprüngliche Wert wird nicht geändert.

Zum Beispiel:

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

Hier my_dict wird der Aufruf foo(my_dict) als Nebenwirkung verändert werden.

jedoch:

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

Hier wird my_dict nicht geändert. d ist eine lokale Variable in foo, und es wurde geändert, um auf ein neues Wörterbuch statt my_dict zu zeigen.

Sie müssen auch bewusst sein, dass in Python, Sie haben wandelbar und unveränderlich Werte. Zeichenfolgen sind beispielsweise unveränderlich. Sie werden niemals in der Lage sein, eine Zeichenkette zu ändern, Sie können nur eine Zeichenkette verwenden, um neue Zeichenketten zu konstruieren (und oft weisen Sie diese neuen Werte der gleichen Variablen zu, damit sie einen ähnlichen Effekt hat); Eine Nebenwirkung einer Funktion zu haben, die einen der Werte ändert, die übergeben werden, kann nur funktionieren, wenn sie veränderbare Werte sind.

Es ist im Allgemeinen eine schlechte Idee für Ihre Funktionen, ihre Argumente zu ändern. Ein besserer Ansatz besteht darin, dass sie neue Werte zurückgeben, die der Anrufer dann ausführen kann, was er will.

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

Alternativ können Sie Attribute auf Ihrer Klasse verwenden:

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

Um zusammenzufassen, wie Spoonmeiser schlägt vor und fügen 'return var' zu' myFunction' hinzu und ändern Sie Ihren RF-Code, um '$ {var} = myFunction ...' neu zuzuweisen – MarkHu

Verwandte Themen