sagemath / sage

Main repository of SageMath
https://www.sagemath.org
Other
1.46k stars 484 forks source link

Mutable defaults in function/method definitions #14795

Open mguaypaq opened 11 years ago

mguaypaq commented 11 years ago

Several functions and methods in Sage have mutable default arguments, especially lists. This is generally frowned upon, at least on the Python side (see http://effbot.org/zone/default-values.htm), since it can cause so many subtle bugs, and there's usually no benefit to doing this instead of using a tuple or None (with creation of the mutable argument in the function body).

Are there any objections to fixing this?

Here is a somewhat filtered (and certainly non-exhaustive) output of a naive grep search through the codebase:

sage/combinat/partition.py:    def content(self, r, c, multicharge=[0]):
sage/combinat/partition.py:    def dimension(self, smaller = [], k = 1):
sage/combinat/root_system/pieri_factors.py:    def __classcall__(cls, W, min_length = 0, max_length = infinity, min_support = frozenset([]), max_support = None):
sage/combinat/root_system/weight_lattice_realizations.py:        def plot(self, size=[[0],[0]], projection='usual', simple_roots=True, fundamental_weights=True, alcovewalks=[]):
sage/combinat/tableau.py:    def content(self, k, multicharge=[0]):
sage/combinat/designs/covering_design.py:    def __init__(self, v=0, k=0, t=0, size=0, points=[], blocks=[], low_bd=0, method='', creator ='',timestamp=''):
sage/combinat/integer_vector.py:def _slider01(A, t, k, p1, p2, fixedcols=[]):
sage/plot/graphics.py:    def _extract_kwds_for_show(cls, kwds, ignore=[]):
sage/matrix/benchmark.py:def report(F, title, systems = ['sage', 'magma'], **kwds):
sage/server/notebook/worksheet.py:    def do_sage_extensions_preparsing(self, s, files_seen_so_far=[], this_file=''):
sage/sets/family.py:def Family(indices, function = None, hidden_keys = [], hidden_function = None, lazy = False, name=None):
sage/modular/etaproducts.py:def eta_poly_relations(eta_elements, degree, labels=['x1','x2'], verbose=False):
sage/modular/modform/find_generators.py:    def generators(self, maxweight=8, prec=10, start_gens=[], start_weight=2):
sage/modular/modform/find_generators.py:    def gen_forms(self, maxweight=8, start_gens=[], start_weight=2):
sage/quadratic_forms/random_quadraticform.py:def random_quadraticform(R, n, rand_arg_list=[]):
sage/quadratic_forms/random_quadraticform.py:def random_quadraticform_with_conditions(R, n, condition_list=[], rand_arg_list=[]):
sage/groups/perm_gps/cubegroup.py:def color_of_square(facet, colors=['lpurple', 'yellow', 'red', 'green', 'orange', 'blue']):
sage/groups/perm_gps/cubegroup.py:    def plot_cube(self, mv, title=True, colors = [lpurple, yellow, red, green, orange, blue]):
sage/groups/perm_gps/cubegroup.py:    def __init__(self, state=None, history=[], colors=[lpurple,yellow,red,green,orange,blue]):
sage/rings/number_field/totallyreal_rel.py:def enumerate_totallyreal_fields_rel(F, m, B, a = [], verbose=0, return_seqs=False):
sage/rings/number_field/number_field_ideal.py:    def invertible_residues_mod(self, subgp_gens=[], reduce=True):
sage/rings/polynomial/groebner_fan.py:    def __init__(self, gfan_polyhedral_fan, parameter_indices = []):
sage/rings/polynomial/groebner_fan.py:    def __init__(self, gfan_polyhedral_fan, polynomial_system, poly_ring, parameters = []):
sage/rings/polynomial/groebner_fan.py:    def tropical_intersection(self, parameters = [], symmetry_generators = [], *args, **kwds):
sage/geometry/polytope.py:    def convex_hull(self, points=[]):
sage/doctest/forker.py:    def __init__(self, source, options, funclist=[]):
sage/homology/cubical_complex.py:    def __init__(self, maximal_faces=[], **kwds):
sage/interfaces/magma.py:    def function_call(self, function, args=[], params={}, nvals=1):
sage/interfaces/qepcad.py:    def __init__(self, formula, vars, qvars=[]):
sage/interfaces/frobby.py:    def __call__(self, action, input=None, options=[], verbose=False):
sage/misc/preparser.py:def containing_block(code, ix, delimiters=['()','[]','{}'], require_delim=True):
sage/misc/sage_unittest.py:    def run(self, category = None, skip = [], catch = True, raise_on_failure = False, **options):
sage/misc/latex.py:    def __init__(self, bb=False, delimiters=["(", ")"]):
sage/misc/profiler.py:    def __init__(self, systems=[], verbose=False):
sage/schemes/elliptic_curves/ell_egros.py:def is_possible_j(j,S=[]):
sage/schemes/elliptic_curves/ell_egros.py:def egros_from_j_1728(S=[]): 
sage/schemes/elliptic_curves/ell_egros.py:def egros_from_j_0(S=[]):
sage/schemes/elliptic_curves/ell_egros.py:def egros_from_j(j,S=[]): 
sage/schemes/elliptic_curves/ell_egros.py:def egros_from_jlist(jlist,S=[]): 
sage/schemes/elliptic_curves/ell_egros.py:def egros_get_j(S=[], proof=None, verbose=False):
sage/schemes/elliptic_curves/constructor.py:def EllipticCurves_with_good_reduction_outside_S(S=[], proof=None, verbose=False):
sage/schemes/elliptic_curves/ell_number_field.py:    def regulator_of_points(self, points=[], precision=None):
sage/schemes/elliptic_curves/ell_rational_field.py:    def has_good_reduction_outside_S(self,S=[]):

CC: @fchapoton

Component: misc

Issue created by migration from https://trac.sagemath.org/ticket/14795

mkoeppe commented 2 years ago

Changed author from Mathieu Guay-Paquet to none

mkoeppe commented 2 years ago
comment:4

git grep 'def.*=[[]' reveals that we still have many of these as of 9.7.rc2