Using square brackets as notation is inconsistent and needless complication. I understand the reasoning for using square brackets instead of angular brackets(less than/more than) notation, but I'd much rather use normal brackets (__call__) to communicate meaning. If I write *Optional(T)* you could guess it means type T encapsulated in Optional. *Optional[T]* at a first glance (if you haven't read PEP 484) means element of Optional under key T.