You can do it with a positional argument like that, but if you do, it will overwrite the value that a user may have set at the class level. In some cases setting at the class level isn’t useful or meaningful, but if it is, you can instead add an assertion or raise an exception, e.g. with if input_dict is None: raise ValueError("input_dict cannot be None"). That way a user can do Test1.input_dict=dict(a=2) ; t=Test1(), while still erroring if indeed no input_dict has been supplied at all.