3 ms·
The conditional expression __name___ == '__main__' simply tests whether this Python file is being executed from command line. It’s one of the ubiquitous Py
by divbzero 6y ago
The conditional expression
__name___ == '__main__'
simply tests whether this Python file is being executed from command line.
It’s one of the ubiquitous Python idioms that doesn’t actually follow Python’s zen of “readability”.
- theptip 6y agoAgreed on this point, it's the `public void static main` of Python. Perhaps I shouldn't have tried to make two points in one post; I wouldn't advocate using docopt or a main function for a simple script, I was more making the case for how easy it is to add proper parameter parsing when you need it; that is easier to remember than what you'd end up writing in bash, which is something like: PARAMS="" while (( "$#" )); do case "$1" in -a|--my-boolean-flag) MY_FLAG=0 shift ;; -b|--my-flag-with-argument) if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then MY_FLAG_ARG=$2 shift 2 else echo "Error: Argument for $1 is missing" >&2 exit 1 fi ;; -*|--*=) # unsupported flags echo "Error: Unsupported flag $1" >&2 exit 1 ;; *) # preserve positional arguments PARAMS="$PARAMS $1" shift ;; esac done # set positional arguments in their proper place eval set -- "$PARAMS" I think you've got to write a lot of bash before you can remember how to write `while (( "$#" )); do` off the top of your head; the double-brackets and [ vs ( are particularly error-prone pieces of syntax.
- rmetzler 6y agoBut the point of the article is not to make complicated scripts readable again, but to put even simpler commands (maybe even one long mysqldump command) into very short scripts. I agree that a cli framework is often easier to use than bash, but it also is a dependency. I think everyone should use what he’s familiar with.
- wahern 6y agoIdiomatic shell code would be: while getopts "ab:" OPTC; do case "$OPTC" in a) MY_FLAG=0 ;; b) MY_FLAG_ARG="$OPTARG" ;; *) # shell already printed diagnostic to stderr exit 1 ;; esac done shift $((OPTIND - 1)) Yes, I realize it's more difficult to support long options (though not that difficult), but the best tool for the job will rarely check all the boxes. Anyhow, the arguments for long options are weakest in the case of simple shell scripts. (Above code doesn't handle mixed arguments either but GNU-style permuted arguments are evil. But unlike the Bash example the above code does support bundling, which is something I and many Unix users would expect to always be supported.) Also, I realize there's a ton of Bash code that looks exactly like you wrote. But that's on Google--in promoting Bash to the exclusion of learning good shell programming style they've created an army of Bash zombies who try to write Bash code like they would Python or JavaScript code, with predictable results.