If I have a class hierarchy and use it like follows, including a third-party subclass that I can't change
class Base:
def doit(self):
pass
class Sub(Base):
def doit(self):
print('hi')
class SubInThirdPartyLibrary(Base):
def doit(self):
print('hi from library')
def doit(x: Base):
x.doit()
doit(Sub())
doit(SubInThirdPartyLibrary())
Is there any way I can add an optional parameter to the base class, use that in the subclass, without breaking the third-party class?
class Base:
def doit(self, msg: str = 'hi'):
pass
class Sub(Base):
def doit(self, msg: str = 'hi'):
print(msg)
class SubInThirdPartyLibrary(Base):
def doit(self): # This isn't mine, I can't add the parameter here but want it to keep working.
print('hi from library')
def doit(x: Base):
x.doit(hi='hello')
doit(Sub())
doit(SubInThirdPartyLibrary()) # TypeError: doit() takes 1 positional argument but 2 were given
You can use inspect.signature:
import inspect
def doit(x: Base):
sig = inspect.signature(x.doit)
if 'msg' in sig.parameters:
x.doit(msg='hello')
else:
x.doit()
I would recommend against doing this, and instead try another solution.