Cla*_*diu 10 python design-patterns coding-style
有时在我的代码中,我有一个函数可以用两种方式之一进行参数.就像是:
def func(objname=None, objtype=None):
if objname is not None and objtype is not None:
raise ValueError("only 1 of the ways at a time")
if objname is not None:
obj = getObjByName(objname)
elif objtype is not None:
obj = getObjByType(objtype)
else:
raise ValueError("not given any of the ways")
doStuffWithObj(obj)
Run Code Online (Sandbox Code Playgroud)
有没有更优雅的方式来做到这一点?如果arg可以采用三种方式之一怎么办?如果类型不同我可以做:
def func(objnameOrType):
if type(objnameOrType) is str:
getObjByName(objnameOrType)
elif type(objnameOrType) is type:
getObjByType(objnameOrType)
else:
raise ValueError("unk arg type: %s" % type(objnameOrType))
Run Code Online (Sandbox Code Playgroud)
但如果他们不是呢?这种选择似乎很愚蠢:
def func(objnameOrType, isName=True):
if isName:
getObjByName(objnameOrType)
else:
getObjByType(objnameOrType)
Run Code Online (Sandbox Code Playgroud)
因此,你必须称之为func(mytype, isName=False)奇怪的.
如何使用命令调度模式:
def funct(objnameOrType):
dispatcher = {str: getObjByName,
type1: getObjByType1,
type2: getObjByType2}
t = type(objnameOrType)
obj = dispatcher[t](objnameOrType)
doStuffWithObj(obj)
Run Code Online (Sandbox Code Playgroud)
其中type1,type2等是实际的python类型(例如int,float等).