Can check to see if specified default factory or value is present, can check to see if class is instanciable with no arguments If not then can try and find the type of those arguments in the signature and use that to find default values for those types and use those instances to instanciate the desired type.
Complex types
What about complex types found in the typing module, the above method could generate an instance of tuple-> () but it couldnt generate an instance of tuple[ str]-> ( "")
list is easy as its arguments dont indicate a prescence
dict is the same
NewType( "A", str) should have the same default instance as str
Union[ g, h, j] can just have the default instance of the element at index 0. this is g here
Any can have a default instance of None
ForwardRef needs to have the same default instance of the thing that its refering to