To be a little more specific on arguments going before or after the the main arguments, the issue typically is the getopt(3) call. GNU’s libc modifies the “standard” (making air quotes here) so args can be accepted anyplace. But as GNU kinda eschews traditional Unix simplicity and implements everything, which I think is a good thing, it also provides a facility to make getopt behave strictly in a POSIX standard so of way, like the traditional getopt. Sometimes (very rarely) applications may add a restriction on the compile so it acts the traditional way. I really dislike that–you command-line-edit to bring up the previous command, and have to zoom all the way back to the start nearly but not quite, and stick in your argument. GNU tends to infect everything, so you never can be sure what commands on the BSDs or Solaris 10 do until you try them, these days.
The Python getopt class behave the traditional Unixy way, too, unless you tell it not to. But these days, everyone with sense uses argparse. I forget if the command-line getopt behaves that way or not. I tell, you one nice thing about Systemd is not having to go read the man page for getopt(1) to figure out how to write an init.d script. I never did it often enough to memorize, and I had to spend 10 minutes puzzling over it every time.