以下是我的情况:我得到了布尔a
和b
,我的函数eatAB()
可以吃a或b或者不吃。
这是我的问题:eatAB()
必须被调用一次,我希望它“聪明而漂亮”。我可以这样做:
if not a and not b:
eatAB()
elif a and not b:
eatAB(a=a)
elif not a and b:
eatAB(b=b)
else:
eatAB(a,b)
但是对我来说,这个很糟糕)是否有更漂亮或更好或更聪明或其他方式来做到这一点?感谢你的时间。
答案 0 :(得分:0)
此帖子分为两部分,顶部是基于OP的新信息的更新答案 - 关于eatAB()
不允许或无法修改。第二个答案是如果您有权修改功能本身,那么您将如何解决此问题的原始答案。
更新了答案(您缺少修改功能的访问/权限)
由于您无权在内部更改功能,但您确实知道它的签名eatAB(a=None,b=None)
,我们希望遵循此逻辑(来自问题):
True
),我们想要传递值None
使用以下表达式可以轻松完成此操作:
value if condition else otherValue
在调用函数时使用它时会出现以下情况:
a = False
b = True
eatAB(a if a else None, b if b else None)
# will be the same as calling eatAB(None, True) or eatAB(b=True)
当然,如果a和b的值本身来自一个条件,你可以使用那个条件。例如:
eatAB(someValue if "a" in myDictionary else None, someOtherValue if "b" in myDictionary else None)
原始答案(您有权修改此功能):
不知道eatAB()
究竟做了什么或它的确切签名,我能推荐的最好的是以下内容。我确定你可以根据需要调整它。
主要思想是将该逻辑移动到eatAB()
,因为它是函数的责任而不是调用代码。说明在评论中:
# for parameters a and b to be optional as you have shown, they must have a default value
# While it's standard to use None to denote the parameter is optional, the use case shown in the question has default values where a or b are False - so we will use that here.
def eatAB(a=False, b=False):
# check if the parameters are truthy (e.g. True), in which case you would have passed them in as shown in the question.
if a:
# do some logic here for when a was a truthy value
if b:
# do some logic here for when b was a truthy value
# what exactly the eatAB function I cannot guess, but using this setup you will have the same logic as wanted in the question - without the confusing conditional block each time you call it.
# function can then be called easily, there is no need for checking parameters
eatAB(someValue, someOtherValue)
感谢Chris_Rands的改进建议。