Иногда в моем коде есть функция, которая может принимать аргумент одним из двух способов. Что-то вроде:
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)
Есть ли более элегантный способ сделать это? Что если арг может прийти одним из трех способов? Если типы различны, я мог бы сделать:
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))
Но что, если их нет? Эта альтернатива кажется глупой:
def func(objnameOrType, isName=True):
if isName:
getObjByName(objnameOrType)
else:
getObjByType(objnameOrType)
потому что тогда вы должны назвать это как func(mytype, isName=False)
, что странно.