(self)
| 1643 | return text and text[0] in "0123456789\"'" |
| 1644 | |
| 1645 | def parse_expr(self): |
| 1646 | match, pos = self.match() |
| 1647 | if self.is_literal(match.group()): |
| 1648 | expr = _Node("literal", match.group()) |
| 1649 | else: |
| 1650 | expr = _Node("param", self.text[self.pos : pos]) |
| 1651 | self.pos = pos |
| 1652 | while self.pos < len(self.text): |
| 1653 | if ( |
| 1654 | self.text[self.pos] == "." |
| 1655 | and self.pos + 1 < len(self.text) |
| 1656 | and self.text[self.pos + 1] in self.namechars |
| 1657 | ): |
| 1658 | self.pos += 1 |
| 1659 | match, pos = self.match() |
| 1660 | attr = match.group() |
| 1661 | expr = _Node("getattr", expr, attr) |
| 1662 | self.pos = pos |
| 1663 | elif self.text[self.pos] == "[": |
| 1664 | saved_pos = self.pos |
| 1665 | self.pos += 1 |
| 1666 | key = self.parse_expr() |
| 1667 | if self.text[self.pos] == "]": |
| 1668 | self.pos += 1 |
| 1669 | expr = _Node("getitem", expr, key) |
| 1670 | else: |
| 1671 | self.pos = saved_pos |
| 1672 | break |
| 1673 | else: |
| 1674 | break |
| 1675 | return expr |
| 1676 | |
| 1677 | |
| 1678 | class SafeEval: |
no test coverage detected