Quoting from the reference documentation:
Python evaluates expressions from left to right.
So yes, you can count on that (with one exception, see below).
A call (the (...)
part after a primary, such as a function name) is just another expression primary, and the arguments for the call are just more expressions.
Note: There is one exception to this rule. When using *expression
in a call (to expand an iterable to form additional positional arguments), then this expression is evaluated before any keyword argument expressions:
>>> from itertools import count
>>> def bar(n, r=(), c=count()): print(f'{next(c)}: bar({n!r})'); return r
...
>>> def foo(*args, **kwargs): pass
...
>>> foo(bar('a1'), spam=bar('a2'), *bar('varargs'), **bar('kwargs', {}))
0: bar('a1')
1: bar('varargs')
2: bar('a2')
3: bar('kwargs')
The linked documentation states:
A consequence of this is that although the *expression
syntax may appear after explicit keyword arguments, it is processed before the keyword arguments[.]