While Python is increasingly popular, program analysis tooling for Python is lagging. This is due, in part, to complex features of the Python language. In addition to the ``usual suspects'', reflection and dynamic execution, the Python language introduces other complex features with difficult to understand and model semantics, e.g., context managers, decorators, and generators, among others. This paper explores how often and in what ways developers use certain complex features. We address three research questions: (i)~How often do developers use certain complex Python features? (ii)~In what ways to developers use these features? (iii)~Does use of complex features increase or decrease over time?
Our findings show that usage of dynamic features that pose a threat to static analysis is infrequent. On the other hand, usage of context managers and decorators is surprisingly widespread. Our actionable result is a list of Python features that any ``minimal syntax'' ought to handle in order to capture developers’ use of the Python language. Understanding the usage of Python features can help guide tool-builders and researchers towards building sound and efficient program analysis tools for Python.