Hidden features of Python [closed] Hidden features of Python [closed] python python

Hidden features of Python [closed]


Chaining comparison operators:

>>> x = 5>>> 1 < x < 10True>>> 10 < x < 20 False>>> x < 10 < x*10 < 100True>>> 10 > x <= 9True>>> 5 == x > 4True

In case you're thinking it's doing 1 < x, which comes out as True, and then comparing True < 10, which is also True, then no, that's really not what happens (see the last example.) It's really translating into 1 < x and x < 10, and x < 10 and 10 < x * 10 and x*10 < 100, but with less typing and each term is only evaluated once.


Get the python regex parse tree to debug your regex.

Regular expressions are a great feature of python, but debugging them can be a pain, and it's all too easy to get a regex wrong.

Fortunately, python can print the regex parse tree, by passing the undocumented, experimental, hidden flag re.DEBUG (actually, 128) to re.compile.

>>> re.compile("^\[font(?:=(?P<size>[-+][0-9]{1,2}))?\](.*?)[/font]",    re.DEBUG)at at_beginningliteral 91literal 102literal 111literal 110literal 116max_repeat 0 1  subpattern None    literal 61    subpattern 1      in        literal 45        literal 43      max_repeat 1 2        in          range (48, 57)literal 93subpattern 2  min_repeat 0 65535    any Nonein  literal 47  literal 102  literal 111  literal 110  literal 116

Once you understand the syntax, you can spot your errors. There we can see that I forgot to escape the [] in [/font].

Of course you can combine it with whatever flags you want, like commented regexes:

>>> re.compile(""" ^              # start of a line \[font         # the font tag (?:=(?P<size>  # optional [font=+size] [-+][0-9]{1,2} # size specification ))? \]             # end of tag (.*?)          # text between the tags \[/font\]      # end of the tag """, re.DEBUG|re.VERBOSE|re.DOTALL)


enumerate

Wrap an iterable with enumerate and it will yield the item along with its index.

For example:

>>> a = ['a', 'b', 'c', 'd', 'e']>>> for index, item in enumerate(a): print index, item...0 a1 b2 c3 d4 e>>>

References: