const_fold.py 文件源码

python
阅读 25 收藏 0 点赞 0 评论 0

项目:fatoptimizer 作者: vstinner 项目源码 文件源码
def check_binop(self, op, left, right):
        if isinstance(left, COMPLEX_TYPES) and isinstance(right, COMPLEX_TYPES):
            if isinstance(op, DIVIDE_BINOPS) and not right:
                # x/0: ZeroDivisionError
                return False

            if isinstance(op, ast.Pow):
                if isinstance(left, complex) or isinstance(right, complex):
                    return False

                return check_pow(self.config, left, right)

            if isinstance(op, (ast.LShift, ast.RShift)) and right < 0:
                # 1 << -3 and 1 >> -3 raise a ValueError
                return False

        if isinstance(left, int) and isinstance(right, int):
            return True

        if isinstance(left, FLOAT_TYPES) and isinstance(right, FLOAT_TYPES):
            return isinstance(op, FLOAT_BINOPS)

        if isinstance(left, COMPLEX_TYPES) and isinstance(right, COMPLEX_TYPES):
            return isinstance(op, COMPLEX_BINOPS)

        if isinstance(op, ast.Mult):
            if isinstance(right, int):
                # bytes * int
                if isinstance(left, bytes):
                    return (len(left) * right <= self.config.max_bytes_len)
                # str * int
                if isinstance(left, str):
                    return (len(left) * right <= self.config.max_str_len)
                # tuple * int
                if isinstance(left, tuple):
                    size = get_constant_size(left)
                    return (size * right <= self.config.max_seq_len)

            if isinstance(left, int):
                # int * bytes
                if isinstance(right, bytes):
                    return (left * len(right) <= self.config.max_bytes_len)
                # int * str
                if isinstance(right, str):
                    return (left * len(right) <= self.config.max_str_len)
                # int * tuple
                if isinstance(right, tuple):
                    size = get_constant_size(right)
                    return (left * size <= self.config.max_seq_len)

        if isinstance(op, ast.Add):
            if isinstance(left, str) and isinstance(right, str):
                return ((len(left) + len(right)) <= self.config.max_str_len)

            if isinstance(left, bytes) and isinstance(right, bytes):
                return ((len(left) + len(right)) <= self.config.max_bytes_len)

            if isinstance(left, tuple) and isinstance(right, tuple):
                return ((len(left) + len(right)) <= self.config.max_seq_len)

        return False
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号