Хм ... это почти похоже на то, что вы должны делать с functools.singledispatch
и typing.Literal
, но я не могу заставить их работать вместе, по крайней мере, в python 3.7 (с * 1003). * исходя из typing_extensions
модуля). Я думаю, что в целом singledispatch
, вероятно, единственный инструмент, который действительно получит то, о чем вы просили, поскольку разные зарегистрированные функции могут иметь совершенно разные подписи. Однако для этого наши методы должны быть разных классов.
from functools import singledispatch
class Method1():
pass
class OtherMethods():
pass
@singledispatch
def f(method, b, c):
return b + c
@f.register(Method1)
def _(method, b):
return b
f(Method1(), 12) # returns 12
f(Method1(), 12, 7) # raises an error
f(OtherMethods(), 12) # raises an error
f(OtherMethods(), 12, 7) # returns 19
Теперь это не совсем то, что вы просили, но аргументы применяются в подписи.
Если кто-то, кто знает больше о реализации singledispatch
и Literal
, возможно, сможет объяснить взаимодействие между ними.
Одна более простая вещь, которую можно сделать, это просто определить c
по умолчанию для некоторого недопустимого значения.
def f(a, b, c=None):
if a == 'method1':
c = 0
return b + c
Это решает проблему, заключающуюся в том, что если пользователь забудет установить c
для метода, кроме method1
, он получит (возможно, crypti * 1025). *) сообщение об ошибке. Однако это не исправляет тот факт, что если они установят c
при использовании method1
, это значение будет игнорироваться и, возможно, приведет к путанице.