Python 条件运算符用法
Python Conditional Operator Useage
我试图更好地理解将条件变量实现到 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
.
我意识到我可以有几个条件语句 select 根据参数的正确格式的请求,但是对于函数中需要的每个额外 parameterN
,它会变得难以扩展。
我想知道是否有一种方法可以在 payload
中包含条件类型的变量,只有当它不等于默认值集时才会包含该参数;在这种情况下 'None'.
所以如果 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"
}
在只有两个参数的例子中似乎有点不切实际,但是如果我要有一个有很多参数的函数,那么一行 include/exclude 类型的表达式似乎会大大减少整体的数量需要代码。这是我的经验,当我不知道如何让 python 做一些聪明的事情时,这只是因为我不知道怎么做,而不是 python 不能。
是这样的吗?
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()
输出:
{'k2': 2, 'k1': 'v1', 'k4': 'v4'}
{}
我认为这样的方法对您有用,尤其是当默认值特定于键时:
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'}
您可以使用字典理解来过滤值:
>>> 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'}
这样的怎么样
>>> 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}
对于 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'}
>>>
我试图更好地理解将条件变量实现到 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
.
我意识到我可以有几个条件语句 select 根据参数的正确格式的请求,但是对于函数中需要的每个额外 parameterN
,它会变得难以扩展。
我想知道是否有一种方法可以在 payload
中包含条件类型的变量,只有当它不等于默认值集时才会包含该参数;在这种情况下 'None'.
所以如果 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"
}
在只有两个参数的例子中似乎有点不切实际,但是如果我要有一个有很多参数的函数,那么一行 include/exclude 类型的表达式似乎会大大减少整体的数量需要代码。这是我的经验,当我不知道如何让 python 做一些聪明的事情时,这只是因为我不知道怎么做,而不是 python 不能。
是这样的吗?
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()
输出:
{'k2': 2, 'k1': 'v1', 'k4': 'v4'}
{}
我认为这样的方法对您有用,尤其是当默认值特定于键时:
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'}
您可以使用字典理解来过滤值:
>>> 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'}
这样的怎么样
>>> 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}
对于 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'}
>>>