Python 2.7,智能调节

时间:2017-11-23 12:56:13

标签: python algorithm python-2.7 structure pretty-print

以下是我的情况:我得到了布尔ab,我的函数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)

但是对我来说,这个很糟糕)是否有更漂亮或更好或更聪明或其他方式来做到这一点?感谢你的时间。

1 个答案:

答案 0 :(得分:0)

此帖子分为两部分,顶部是基于OP的新信息的更新答案 - 关于eatAB()不允许或无法修改。第二个答案是如果您有权修改功能本身,那么您将如何解决此问题的原始答案。

更新了答案(您缺少修改功能的访问/权限)

由于您无权在内部更改功能,但您确实知道它的签名eatAB(a=None,b=None),我们希望遵循此逻辑(来自问题):

  • 如果我们传入的值是真实的(例如True),我们想要传递值
  • 如果值不为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的改进建议。