def _infer_binop(self, context):
left = self.left<EOL>right = self.right<EOL>context = context or contextmod.InferenceContext()<EOL>lhs_context = contextmod.copy_context(context)<EOL>rhs_context = contextmod.copy_context(context)<EOL>lhs_iter = left.infer(context=lhs_context)<EOL>rhs_iter = right.infer(context=rhs_context)<EOL>for lhs, rhs in itertools.product(lhs_iter, rhs_iter):<EOL><INDENT>if any(value is util.Uninferable for value in (rhs, lhs)):<EOL><INDENT>yield util.Uninferable<EOL>return<EOL><DEDENT>try:<EOL><INDENT>yield from _infer_binary_operation(lhs, rhs, self, context, _get_binop_flow)<EOL><DEDENT>except exceptions._NonDeducibleTypeHierarchy:<EOL><INDENT>yield util.Uninferable<EOL><DEDENT><DEDENT>
Binary operation inference logic.