def __call__(self, *args, **kwds): if args and kwds: raise TypeError("You can pass either positional or keyword " "arguments, but not both.") elif len(args or kwds) != self.dimension: raise TypeError("You must pass exactly {} " "value(s) ({} given).".format(self.dimension, len(args or kwds))) elif not args and tuple(sorted(iterkeys(kwds))) != self.letters: diff_set = set(iterkeys(kwds)) - set(self.letters) diff_joint = "', '".join(diff_set) raise TypeError("Invalid letter(s): '{}'".format(diff_joint)) if args: for i, l in enumerate(self.letters): kwds[l] = args[i] if any(not isinstance(v, numbers.Number) for v in itervalues(kwds)): sorted_list = sorted(v for v in itervalues(kwds)\ if not isinstance(v, numbers.Number)) inv_joint = "', '".join(sorted_list) raise TypeError("Invalid value for letter(s): " "'{}'".format(inv_joint)) if not self: return 0 elif self.is_constant(): return sum(m[0] for m in self._monomials) return sum(c * functools.reduce(operator.mul, (kwds[x] ** l[x] for x in l), 1)\ for c, l in self._monomials)
def is_square(m): if m[0] < 0: return False sqrt_c = m[0] ** 0.5 is_square_c = sqrt_c == int(sqrt_c) is_square_l = all(not d % 2 for d in itervalues(m[1])) return is_square_c and is_square_l
def is_square(m): sqrt_c = abs(m[0]) ** 0.5 is_square_c = sqrt_c == int(sqrt_c) is_square_l = all(not d % 2 for d in itervalues(m[1])) return is_square_c and is_square_l
def all_monomial_degrees(self): if not self: return () return tuple(sum(itervalues(m[1])) for m in self._monomials)