【问题标题】:How to pass optional arguments with a keyword dictionary [duplicate]如何使用关键字字典传递可选参数[重复]
【发布时间】:2020-07-07 08:37:26
【问题描述】:

我正在编写一个检查数据文件格式(如 csv)的脚本

我对每个字段应用各种规则:最大长度、空字段、值边界、正则表达式匹配(检查有效电子邮件)等...

字典中的这些规则(每个 collum 都有一个):

#column 1 : integer from 1 to 99, except 10
{
"minval":1,
"forbiddenvals": [10,15],
"maxval":100
}

我的函数定义如下:

def vercol(data,
           empty=False,isadate = None,
           minlen=None,maxlen=None,
           minval=None,maxval=None,
           allowedvals=[],forbiddenvals=[],
           regex =None):
    """
    Verify if the field 'data' checks the rules
    
    Parameters /Rules
    ----------     
    empty : Boolean, optional
        set to True if empty field is accepted. The default is False.      
    minlen : integer, optional
        If set, minimum length for the field.    
    maxlen : integer, optional
        If set, maximum length for the field.       
    forbidenvals : List, optional
        List of rejected values.
    (...)

    Returns
    -------
    True if all the rules are met. 
    "xError" if a test failled, where x depend of the wich test failed FIRST
    """
    
    if data == "":
        return True if empty else "EmptyFieldError" 
    if minlen and len(data) < int(minlen):
        return "MinLengthError"
    ....
    other rules
    ....
    return True

正常调用参数时,函数运行不正常:

我想做的是像这样传递字典:

rules = {
    "minval":1,
    "forbiddenvals": [10,15],
    "maxval":100
    }
result = vercol(field, rules)
#foo

问题:它不起作用,尽管在字典中,参数只使用它们的默认值。

#works fine
vercol('abcdefghi', maxlen=4) #return "MaxLenError"
vercol('', maxlen=4) #return "EmptyFieldError"
vercol('', empty=True) #return True

#problem 
rule = {"maxlen":4,"empty":False}
vercol('',rule) #retuns True , expected : "EmptyFieldError"
vercol('abcdefgh',rule) #retuns True , expected : "MaxLenError"

有什么线索可以解决这个问题吗?

【问题讨论】:

  • result = vercol(field, **rules)
  • 好的,谢谢蒂埃里。我强硬的 * 和 ** 说明符仅适用于函数定义。

标签: python dictionary parameter-passing


【解决方案1】:

您必须使用 ** 解压 dict。试试看

rules = {
    "minval":1,
    "forbiddenvals": [10,15],
    "maxval":100
    }
result = vercol(field, **rules)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2017-11-26
    • 2010-09-24
    • 2018-11-14
    • 2014-06-04
    • 2021-09-11
    相关资源
    最近更新 更多