Python条件运算符用法

时间:2017-01-08 19:48:28

标签: python python-requests conditional-operator

我正在尝试更好地理解将条件变量实现为python请求的http请求的方法。

我正在做以下事情:

def make_post(parameter1_value, parameter2='None'):

    payload = {
        "parameter1": parameter1_value,
        "parameter2": "None"
    }

    r = requests.post('https://myrequesturl.com/location/', params=payload)

我正在尝试找到不在参数中包含"parameter2": "None"值的最佳方法,除非该值不等于None

我意识到我可以有几个条件语句来根据参数选择合适的请求格式,但是对于函数中所需的每个额外parameterN,它会变得难以扩展。

我想知道是否有办法在payload中包含条件类型的变量,只有当它不等于默认值集时才会包含该参数;在这种情况下'无'。

因此,如果parameter2 = None的值:

    payload = {
        "parameter1": parameter1_value
    }

但如果parameter2的值= None

以外的任何值
payload = {
            "parameter1": parameter1_value,
            "parameter2": "Non_default_value"
        }

我试图避免采用以下类型的方法:

if some_parameter != 'None':
    payload = {
                "one": "arrangement"
            }

if some_some_other_parameter != 'None':
    payload = {
                "one": "arrangement"
            }

在仅有两个参数的示例中似乎有点不切实际,但如果我要使用具有许多参数的函数,则看起来一行包含/排除类型表达式将大大减少所需的整体代码量。这是我的经验,当我无法弄清楚如何让python做一些聪明的事情只是因为我不知道怎么做,而不是那个python不能。

4 个答案:

答案 0 :(得分:3)

这样的东西?

for /F "delims=" %%S in (^""!search!"^") do (
    for /F "delims=" %%R in (^""!replaceVal!"^") do (
        set "replace=!replace:%%~S=%%~R!"
    )
)

输出:

def foo(v1, v2=None):
    params = {k:v for k,v in locals().items() if v!=None}
    print params

foo('hello')
foo('hello', 'world')

或者

这样的东西?

{'v1': 'hello'}
{'v1': 'hello', 'v2': 'world'}

输出:

def foo(a={}, url=''):
    params = {k:v for k,v in a.items() if v!=None}
    print params

foo({'k1':'v1','k2':2,'k3':None, 'k4':'v4'})
foo()

答案 1 :(得分:2)

我认为这样的事情对你有用,特别是如果默认值是特定于密钥的话:

def optional_include_mut(payload, key, value, default=None):
    """
    Mutate the given payload dict by adding the given key/value pair if the value is not equal to default.

    :param payload: Dict to mutate
    :param key: Key to insert into dict
    :param value: Value to insert into dict
    :param default: Default value to control insertion
    :return: A mutated version of the payload dict
    """
    if value != default:
        payload[key] = value
    return payload

>>> payload = dict(good=1)
>>> payload = optional_include_mut(payload, 'foo', 'bar', default='bar')
{'good': 1}
>>> payload = optional_include_mut(payload, 'foo', 'bar', default='not bar')
{'good': 1, 'foo': 'bar'}

答案 2 :(得分:0)

您可以使用词典理解来过滤值:

>>> payload = dict(a='value1',b='value2',c='None',d='None',e='value3')
>>> payload
{'a': 'value1', 'b': 'value2', 'c': 'None', 'd': 'None', 'e': 'value3'}
>>> {k:v for k,v in payload.items() if v != 'None'}
{'a': 'value1', 'b': 'value2', 'e': 'value3'}

答案 3 :(得分:0)

这样的事情

>>> def fun(*param):
        return {"parameter{}".format(k): v for k,v in enumerate(param,1) if v not in (None,"None")}

>>> fun("hello","None","world",None,42)
{'parameter1': 'hello', 'parameter5': 42, 'parameter3': 'world'}
>>> 

*param是表示你想要一个可变数量的参数的方法)

这样您可以根据需要传递任意数量的参数,并过滤那些具有无效值的参数

使用python 3语法,您也可以将其作为

def fun(*param, invalid=(None,"None")):
    return {"parameter{}".format(k): v for k,v in enumerate(param,1) if v not in invalid}

for python 2完成相同的将是

def fun(*param, **karg):
    invalid = karg.get("invalid", (None,"None") )
    return {"parameter{}".format(k): v for k,v in enumerate(param,1) if v not in invalid}

另一个例子

>>> fun("hello","None","world",None,42,32, invalid=("None",None,32))
{'parameter1': 'hello', 'parameter5': 42, 'parameter3': 'world'}
>>>