Это как раз то, для чего предназначены как перегруженные методы, так и универсальные функции.
Вот как использовать singledispatch
для реализации его с помощью универсальных функций:
@functools.singledispatch
def helper(arg):
raise TypeError("I expected a type I know about, not some kind of Spanish Inquisition")
@helper.register(list)
def _(arg):
# do listy stuff here
@helper.register(str)
def _(arg):
# do stringy stuff here
def pred_fl(sentence):
# do setup that applies to all types here
stuff = helper(sentence)
# do stuff with stuff here
Конечно, я предполагаю, что куча ваших "вещей" одинакова для двух случаев, и это небольшая, реорганизуемая часть ваших "вещей", которая должна отличаться.
Если все в конечном итоге будет другим, тогда у вас действительно должно быть две функции.
Если, с другой стороны, небольшая часть, которая отличается, тривиальна - или если почти невозможно выделить, потому что она тесно связана со всем остальным, что вы делаете - вы, вероятно, хотите переключение типов. Но проверяя isinstance(sentence, str)
, не проверяя type(sentence)
:
def pred_fl(sentence):
# do setup that applies to all types here
if isinstance(sentence, list):
# do listy stuff that mutates a whole slew of local variables
elif isinstance(sentence, str):
# do stringy stuff that depends on a bunch of local state
# do final stuff here