symbols() function
As other answers noted - one use of **args in symbols is to convey in the Assumptions about the created Symbol . The list of assumptions you can make is documented on the Assumptions page as supported predicates .
However , you should also note that some other special named arguments may be passed.
They are both documented in the section that you link and are in:
Code walk
You noticed that you looked at the code, so I will show you where they are implemented in the code. If you call the symbols() function, it performs various checks on its arguments, including pop -ing cls and seq from **args it then performs more checks, etc., before finally accessing the Symbol instance here , here or here . They invoke the Symbol constructor (or its subclass passed through cls ), with what remains in **args , which are all interpreted as assumptions in the constructor. - they are sanitized here , i.e. invalid or not applicable named arguments are thrown out at this point!
This shows that Assumptions + cls + seq form a set of named arguments that can be passed to **args before symbols()
Other functions (general case)
It seems to me that symbols() can simply serve as a representative example of a more general question. I hope that the above convinces you that all the values that can be used with value in symbols() are documented. This can give you some confidence that the same is true for other features in SymPy.
However, in the general case, the answer is that it is rather difficult to prove to yourself that all the values that can be passed as keywordarguments are contained in the library documentation or the any function. Indeed, sometimes only a subset is documented, since they are the “public API” for the library, while the actual code may take other arguments, but for some reason the developer does not want to publish them to the public. because their availability may change or their functionality has not been tested.
If you pass invalid arguments, the behavior of the library used may be different. Some libraries or functions will ignore them, while others will throw errors if you pass invalid keyword arguments.
If you want to know if this case (and the library is open source, for example, SymPy), you can always dive into the code (as I will show in Code Walk above). If you do this, you need to follow the path of execution, looking for args.pop() . If SymPy has other features that bother you, let me know in the comments, but hopefully this general method will work for you.
I assume that you understand the syntax of *args and **args . If this is not entirely clear to you, this section of the official putoron tutoria deals with this.