Positional arguments work well, as do keyword arguments. I think it's a mistake to support both though.
In e.g. Python it's hard to control how people will call you, and you may have differing views on the API you're exposing.
Related Posts
I'm coming round to the view that a main function shouldn't take arguments.
For example, in Rust you have to call std::env::args() to get CLI arguments.
This makes Hello World less verbose, and gives you more flexibility in setting up CLI argument parsers.
It is remarkably hard to escape command line arguments safely on Windows, and the standard libraries of multiple languages have needed patching: https://flatt.tech/research/posts/batbadbut-you-cant-securely-execute-commands-on-windows/
I've been experimenting with an 'evaluate up to cursor' mode for my PL project.
I love evaluating self-contained snippets in Lisp, this generalises the idea.
The interpreter remembers the arguments when you run tests, then can re-use them when you say 'eval up to here'.
What do you think?