相互排斥的关键字args的优雅模式?

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)奇怪的.

Jos*_*del 8

如何使用命令调度模式:

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等).