有点奇怪的问题,但我在编码时偶然发现了这个问题。
这是我的代码
编辑:我添加了类以使我的结构更清晰
class Hidden(object):
def x(self, aa, bb="John Doe"):
print aa, bb
class Open(object):
def __init__(self):
self.h = Hidden()
def y(self, a, b=None):
# get rid of this if-else-foo
if b is None:
self.h.x(a)
else:
self.h.x(a, b)
o = Open()
o.y("Hello") # > Hello John Doe
o.y("Hello", "Mister X") # > Hello Mister X
如果b
为None
(未设置),我希望在没有参数的情况下调用方法x
(使用默认值)。
我想知道是否有办法摆脱if-else foo?
解
我只能接受一个答案,我可以说,所有列出的解决方案都有效。
这是我对给定答案的总结:
*args
的方法很难阅读。if
声明仍然存在,我想避免这种说法。答案 0 :(得分:4)
如何使用变长参数(*args
):
def y(*args):
x(*args)
然后,没有定义y
的意思!
y = x
<强>更新强>
根据问题更新调整y
方法。但这一点仍然有效;使用*args
获取任意长度参数:
class Open(object):
def __init__(self):
self.h = Hidden()
def y(self, *args):
self.h.x(*args)
# Alternative: explicitly pass `a` for readability
#
# def y(self, a, *args):
# self.h.x(a, *args)
答案 1 :(得分:1)
如果您可以修改x
:
def x(a, b=None):
b = "John Doe" if b is None else b
print a, b
答案 2 :(得分:1)
根据您对课程的更新问题,简单方法就是将self.h.x
别名为y
:
class Open(object):
def __init__(self):
self.h = Hidden()
self.y = self.h.x
现在,当您致电o.y(...)
时,您实际上只是致电Hidden.x
:
o = Open()
o.y("Hello") # > Hello John Doe
o.y("Hello", "Mister X") # > Hello Mister X
答案 3 :(得分:1)
如果您想摆脱'if',那就去做
float
ps。这适用于python3.5 +,我不在乎python2.7
答案 4 :(得分:0)
实际上,你的函数x完全符合预期。
def x(a, b="John Doe"):
print a, b
然后:
>>> x('Hello')
Hello John Doe
>>> x('Hello','Mister X')
Hello Mister X
但如果你真的想,你可以这样做:
def x(a, b="John Doe"):
if b == None: b = "John Doe"
print a, b