Search code examples
pythonargumentspython-c-api

Is there a complete list of built-in functions that cannot be called with keyword argument?


People mentioned in answers a1, a2 that

Due to the way the Python C-level APIs developed, a lot of built-in functions and methods don't actually have names for their arguments.

I found it really annoying cause I'm not be able to know it by looking at the doc. For instance, eval

eval(expression, globals=None, locals=None)

Then I wrote this line of code

print(eval('a+b', globals={'a':1, 'b':2}))

and got TypeError: eval() takes no keyword arguments. So is there a complete list of functions of this kind? How do I know if a function is allowed to have keyword arguments?


Solution

  • In Python 3.5 you can inspect the __text_signature__ of the built-in function:

    >>> eval.__text_signature__
    '($module, source, globals=None, locals=None, /)'
    

    or

    >>> abs.__text_signature__
    '($module, x, /)'
    >>> abs(x=5)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: abs() takes no keyword arguments
    

    (x cannot be used as a keyword argument)

    The / means that the arguments following that can be used as keyword arguments. C.f.

    >>> compile.__text_signature__
    '($module, /, source, filename, mode, flags=0,\n        dont_inherit=False, optimize=-1)'
    >>> compile(source='foo', filename='bar', mode='exec')
    <code object <module> at 0x7f41c58f0030, file "bar", line 1>
    

    Of course there are bugs even in 3.5:

    >>> sorted.__text_signature__
    '($module, iterable, key=None, reverse=False)'
    

    though according to issue 26729 in the Python bug tracker, there ought to be / after the iterable as the iterable cannot be used as a keyword argument.


    Unfortunately this information is not yet available in the Python documentation itself.