If I have a function like this:
def foo(name, opts={}):
pass
And I want to add type hints to the parameters, how do I do it? The way I assumed gives me a syntax error:
def foo(name: str, opts={}: dict) -> str:
pass
The following doesn't throw a syntax error but it doesn't seem like the intuitive way to handle this case:
def foo(name: str, opts: dict={}) -> str:
pass
I can't find anything in the typing
documentation or on a Google search.
Edit: I didn't know how default arguments worked in Python, but for the sake of this question, I will keep the examples above. In general it's much better to do the following:
def foo(name: str, opts: dict=None) -> str:
if not opts:
opts={}
pass
scala
language does it too.
Your second way is correct.
def foo(opts: dict = {}):
pass
print(foo.__annotations__)
this outputs
{'opts': <class 'dict'>}
It's true that's it's not listed in PEP 484, but type hints are an application of function annotations, which are documented in PEP 3107. The syntax section makes it clear that keyword arguments works with function annotations in this way.
I strongly advise against using mutable keyword arguments. More information here.
If you're using typing (introduced in Python 3.5) you can use typing.Optional
, where Optional[X]
is equivalent to Union[X, None]
. It is used to signal that the explicit value of None
is allowed . From typing.Optional:
def foo(arg: Optional[int] = None) -> None:
...
=
in Optional[int] = None
like it is convention for non-type-hinted keyword arguments?
I recently saw this one-liner:
def foo(name: str, opts: dict=None) -> str:
opts = {} if not opts else opts
pass
None
the default and then checking inside the method avoids this problem by allocating a new dict each time the method is invoked.
opts = opts or {}
{}
is passed in. Probably safer to stick with the traditional two-liner if opts is None: opts = {}
. If you need a one-liner, I'd prefer opts = {} if opts is None else opts
.
Success story sharing
=
indict = {}
like it is convention for non-type-hinted keyword arguments?