与Kwargs嵌入争论

时间:2017-12-12 23:22:47

标签: python-3.x robotframework

有没有办法嵌入参数,并将kwargs传递给函数?

例如:

机器人文件

Testcase1
    do something "value" extra_args=bla

Python库

@keyword('do something "${value}"')
def do_something(self, value, **kwargs):
    print(value)
    print(kwargs)

虽然以上方式不起作用。我也试过

Testcase1
    do something "value"    extra_args=bla

另外

*** Variables ***
    &{DICT}        extra_args=bla

Testcase1
    do something "value"    &{DICT}

还有很多其他组合。我在Robotframework中发现了添加此限制的拉取请求,但我确信其他图书馆编写者必须要这个功能。

由于

2 个答案:

答案 0 :(得分:1)

简短回答 - 不,这是不允许的; doc link, the last paragraph in Basic Syntax

考虑一下,我可以看到这个限制来自何处 - 如果kwargs 在具有嵌入参数的关键字中支持,解析器将会非常困难,主要是在两个方面:

  • 在哪里将参数分解为单独的变量?

在此示例代码中:

My keyword @{kwarg} varies
    Pass Execution

,当这样调用时:

My keyword was called varies

,参数应该是什么 - 一个值为was called,还是两个 - wascalled

  • 匹配目标关键字

另一个示例关键字定义:

My keyword @{kwarg}
    Pass Execution

My keyword ${normal} argument
    Pass Execution

,当这样调用时:

My keyword one argument

,解析器匹配哪两个关键字?

正如您所看到的,嵌入式语法中的kwargs会导致问题,这可能只是冰山一角。

旁注 - 尽管我个人发现嵌入式参数的关键词很酷 - 你可以看到简单英语的电话!几乎没有其他语言能给你这种可能性!通过练习我发现它们有限制,现在尽量避免它们 有两个原因 - 您将来无法更改此类关键字的签名,例如添加可选参数(或kwargs;))。第二个参数总是作为字符串对象传递 - 所以如果它处理另一个类型,你必须在关键字中强制转换它们,而忘记传递复杂的对象类型。

答案 1 :(得分:0)

在Robot Framework文档中,这将在Free keyword arguments (**kwargs)部分中进行描述。

  

Robot Framework 2.8增加了对免费关键字参数的支持   Python的kwargs语法。如何在测试数据中使用语法   在创建测试用例下的Free关键字参数部分中讨论。   在本节中,我们将了解如何在自定义中实际使用它   测试库。

这是Python示例:

<?php 

              $id = $_GET['id'];
            $edit = mysqli_query($conn, "SELECT * FROM feedback WHERE id=$id");
            $edit1 = mysqli_fetch_array($edit);
              ?>
<div class="form-group">
                  <label>Rating</label><br>
                  <?php $abc=$edit1['4']; ?> <--value columnnumber of table-->
<fieldset class="rating">
    <input type="radio" id="star5" <?php if($abc==5){echo 'checked';}?>  name="rating" value="<?php echo $abc; ?>" /><label class = "full" for="star5" title="Awesome - 5 stars"></label>
    <input type="radio" id="star4half" <?php if($abc==4.5){echo 'checked';}?> name="rating" value="<?php echo $abc; ?>" /><label class="half" for="star4half" title="Pretty good - 4.5 stars"></label>
    <input type="radio" id="star4" <?php if($abc==4){echo 'checked';}?> name="rating" value="<?php echo $abc; ?>" /><label class = "full" for="star4" title="Pretty good - 4 stars"></label>
    <input type="radio" id="star3half" <?php if($abc==3.5){echo 'checked';}?> name="rating" value="3.5" /><label class="half" for="star3half" title="Meh - 3.5 stars"></label>
    <input type="radio" id="star3" name="rating" <?php if($abc==3){echo 'checked';}?> value="3" /><label class = "full" for="star3" title="Meh - 3 stars"></label>
    <input type="radio" id="star2half" name="rating" <?php if($abc==2.5){echo 'checked';}?> value="2.5" /><label class="half" for="star2half" title="Kinda bad - 2.5 stars"></label>
    <input type="radio" id="star2" name="rating" <?php if($abc==2){echo 'checked';}?> value="2" /><label class = "full" for="star2" title="Kinda bad - 2 stars"></label>
    <input type="radio" id="star1half" name="rating" <?php if($abc==1.5){echo 'checked';}?> value="1.5" /><label class="half" for="star1half" title="Meh - 1.5 stars"></label>
    <input type="radio" id="star1" name="rating" value="1" <?php if($abc==1){echo 'checked';}?> /><label class = "full" for="star1" title="Sucks big time - 1 star"></label>
    <input type="radio" id="starhalf" name="rating" <?php if($abc==.5){echo 'checked';}?> value=".5" /><label class="half" for="starhalf" title="Sucks big time - 0.5 stars"></label>enter code here


</fieldset>

和相应的机器人文件:

def various_args(arg, *varargs, **kwargs):
    print 'arg:', arg
    for value in varargs:
        print 'vararg:', value
    for name, value in sorted(kwargs.items()):
        print 'kwarg:', name, value