все Python 3astпонятие
ast.IsNot
операторы
Маркер сравнения is not в дереве ast: лежит в поле Compare.ops и полей не имеет.
Синтаксис
ast.IsNot()
Два слова — один токен-оператор: 'a is not b' даёт Compare с IsNot, а 'not a is b' — UnaryOp(Not) над Compare с Is; результат одинаков, но правило линтера, ищущее IsNot, второе написание не увидит. Это не то же, что 'a is (not b)': там справа UnaryOp. Узлы-маркеры сравнивают по типу (isinstance), а не через ==: у узлов ast нет __eq__, и ast.IsNot() == ast.IsNot() — False.
Примеры
import ast
print(type(ast.parse('a is not b', mode='eval').body.ops[0]).__name__) # → IsNot
c = ast.parse('a is (not b)', mode='eval').body
print(type(c.ops[0]).__name__, type(c.comparators[0]).__name__) # → Is UnaryOp
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности