Commit d6aa0e99 authored by Stefan Behnel's avatar Stefan Behnel

avoid mutable default arguments (original patch by Rémy Léone)

parent eaf2ce5d
...@@ -625,8 +625,10 @@ def create_dependency_tree(ctx=None, quiet=False): ...@@ -625,8 +625,10 @@ def create_dependency_tree(ctx=None, quiet=False):
# This may be useful for advanced users? # This may be useful for advanced users?
def create_extension_list(patterns, exclude=[], ctx=None, aliases=None, quiet=False, language=None, def create_extension_list(patterns, exclude=None, ctx=None, aliases=None, quiet=False, language=None,
exclude_failures=False): exclude_failures=False):
if exclude is None:
exclude = []
if not isinstance(patterns, (list, tuple)): if not isinstance(patterns, (list, tuple)):
patterns = [patterns] patterns = [patterns]
explicit_modules = set([m.name for m in patterns if isinstance(m, Extension)]) explicit_modules = set([m.name for m in patterns if isinstance(m, Extension)])
...@@ -725,7 +727,7 @@ def create_extension_list(patterns, exclude=[], ctx=None, aliases=None, quiet=Fa ...@@ -725,7 +727,7 @@ def create_extension_list(patterns, exclude=[], ctx=None, aliases=None, quiet=Fa
# This is the user-exposed entry point. # This is the user-exposed entry point.
def cythonize(module_list, exclude=[], nthreads=0, aliases=None, quiet=False, force=False, language=None, def cythonize(module_list, exclude=None, nthreads=0, aliases=None, quiet=False, force=False, language=None,
exclude_failures=False, **options): exclude_failures=False, **options):
""" """
Compile a set of source modules into C/C++ files and return a list of distutils Compile a set of source modules into C/C++ files and return a list of distutils
...@@ -753,6 +755,8 @@ def cythonize(module_list, exclude=[], nthreads=0, aliases=None, quiet=False, fo ...@@ -753,6 +755,8 @@ def cythonize(module_list, exclude=[], nthreads=0, aliases=None, quiet=False, fo
Additional compilation options can be passed as keyword arguments. Additional compilation options can be passed as keyword arguments.
""" """
if exclude is None:
exclude = []
if 'include_path' not in options: if 'include_path' not in options:
options['include_path'] = ['.'] options['include_path'] = ['.']
if 'common_utility_include_dir' in options: if 'common_utility_include_dir' in options:
......
...@@ -116,15 +116,11 @@ def _get_build_extension(): ...@@ -116,15 +116,11 @@ def _get_build_extension():
def _create_context(cython_include_dirs): def _create_context(cython_include_dirs):
return Context(list(cython_include_dirs), default_options) return Context(list(cython_include_dirs), default_options)
def cython_inline(code,
get_type=unsafe_type, def cython_inline(code, get_type=unsafe_type, lib_dir=os.path.join(get_cython_cache_dir(), 'inline'),
lib_dir=os.path.join(get_cython_cache_dir(), 'inline'), cython_include_dirs=None, force=False, quiet=False, locals=None, globals=None, **kwds):
cython_include_dirs=['.'], if cython_include_dirs is None:
force=False, cython_include_dirs = ['.']
quiet=False,
locals=None,
globals=None,
**kwds):
if get_type is None: if get_type is None:
get_type = lambda x: 'object' get_type = lambda x: 'object'
code = to_unicode(code) code = to_unicode(code)
......
...@@ -649,7 +649,9 @@ class CFuncDeclaratorNode(CDeclaratorNode): ...@@ -649,7 +649,9 @@ class CFuncDeclaratorNode(CDeclaratorNode):
else: else:
return None return None
def analyse(self, return_type, env, nonempty = 0, directive_locals = {}): def analyse(self, return_type, env, nonempty=0, directive_locals=None):
if directive_locals is None:
directive_locals = {}
if nonempty: if nonempty:
nonempty -= 1 nonempty -= 1
func_type_args = [] func_type_args = []
......
...@@ -39,7 +39,7 @@ class StringParseContext(Main.Context): ...@@ -39,7 +39,7 @@ class StringParseContext(Main.Context):
return ModuleScope(module_name, parent_module=None, context=self) return ModuleScope(module_name, parent_module=None, context=self)
def parse_from_strings(name, code, pxds={}, level=None, initial_pos=None, def parse_from_strings(name, code, pxds=None, level=None, initial_pos=None,
context=None, allow_struct_enum_decorator=False): context=None, allow_struct_enum_decorator=False):
""" """
Utility method to parse a (unicode) string of code. This is mostly Utility method to parse a (unicode) string of code. This is mostly
...@@ -215,9 +215,16 @@ def strip_common_indent(lines): ...@@ -215,9 +215,16 @@ def strip_common_indent(lines):
class TreeFragment(object): class TreeFragment(object):
def __init__(self, code, name=None, pxds={}, temps=[], pipeline=[], level=None, initial_pos=None): def __init__(self, code, name=None, pxds=None, temps=None, pipeline=None, level=None, initial_pos=None):
if pxds is None:
pxds = {}
if temps is None:
temps = []
if pipeline is None:
pipeline = []
if not name: if not name:
name = "(tree fragment)" name = "(tree fragment)"
if isinstance(code, _unicode): if isinstance(code, _unicode):
def fmt(x): return u"\n".join(strip_common_indent(x.split(u"\n"))) def fmt(x): return u"\n".join(strip_common_indent(x.split(u"\n")))
...@@ -236,7 +243,8 @@ class TreeFragment(object): ...@@ -236,7 +243,8 @@ class TreeFragment(object):
t = transform(t) t = transform(t)
self.root = t self.root = t
elif isinstance(code, Node): elif isinstance(code, Node):
if pxds != {}: raise NotImplementedError() if pxds:
raise NotImplementedError()
self.root = code self.root = code
else: else:
raise ValueError("Unrecognized code format (accepts unicode and Node)") raise ValueError("Unrecognized code format (accepts unicode and Node)")
...@@ -245,7 +253,11 @@ class TreeFragment(object): ...@@ -245,7 +253,11 @@ class TreeFragment(object):
def copy(self): def copy(self):
return copy_code_tree(self.root) return copy_code_tree(self.root)
def substitute(self, nodes={}, temps=[], pos = None): def substitute(self, nodes=None, temps=None, pos = None):
if nodes is None:
nodes = {}
if temps is None:
temps = []
return TemplateTransform()(self.root, return TemplateTransform()(self.root,
substitutions = nodes, substitutions = nodes,
temps = self.temps + temps, pos = pos) temps = self.temps + temps, pos = pos)
......
...@@ -84,10 +84,15 @@ class CythonTest(unittest.TestCase): ...@@ -84,10 +84,15 @@ class CythonTest(unittest.TestCase):
self.assertNotEqual(TreePath.find_first(result_tree, path), None, self.assertNotEqual(TreePath.find_first(result_tree, path), None,
"Path '%s' not found in result tree" % path) "Path '%s' not found in result tree" % path)
def fragment(self, code, pxds={}, pipeline=[]): def fragment(self, code, pxds=None, pipeline=None):
"Simply create a tree fragment using the name of the test-case in parse errors." "Simply create a tree fragment using the name of the test-case in parse errors."
if pxds is None:
pxds = {}
if pipeline is None:
pipeline = []
name = self.id() name = self.id()
if name.startswith("__main__."): name = name[len("__main__."):] if name.startswith("__main__."):
name = name[len("__main__."):]
name = name.replace(".", "_") name = name.replace(".", "_")
return TreeFragment(code, name, pxds, pipeline=pipeline) return TreeFragment(code, name, pxds, pipeline=pipeline)
...@@ -139,7 +144,9 @@ class TransformTest(CythonTest): ...@@ -139,7 +144,9 @@ class TransformTest(CythonTest):
Plans: One could have a pxd dictionary parameter to run_pipeline. Plans: One could have a pxd dictionary parameter to run_pipeline.
""" """
def run_pipeline(self, pipeline, pyx, pxds={}): def run_pipeline(self, pipeline, pyx, pxds=None):
if pxds is None:
pxds = {}
tree = self.fragment(pyx, pxds).root tree = self.fragment(pyx, pxds).root
# Run pipeline # Run pipeline
for T in pipeline: for T in pipeline:
......
...@@ -19,9 +19,9 @@ DEBUG = 0 ...@@ -19,9 +19,9 @@ DEBUG = 0
_reloads={} _reloads={}
def pyx_to_dll(filename, ext = None, force_rebuild = 0,
build_in_temp=False, pyxbuild_dir=None, setup_args={}, def pyx_to_dll(filename, ext=None, force_rebuild=0, build_in_temp=False, pyxbuild_dir=None,
reload_support=False, inplace=False): setup_args=None, reload_support=False, inplace=False):
"""Compile a PYX file to a DLL and return the name of the generated .so """Compile a PYX file to a DLL and return the name of the generated .so
or .dll .""" or .dll ."""
assert os.path.exists(filename), "Could not find %s" % os.path.abspath(filename) assert os.path.exists(filename), "Could not find %s" % os.path.abspath(filename)
...@@ -35,6 +35,8 @@ def pyx_to_dll(filename, ext = None, force_rebuild = 0, ...@@ -35,6 +35,8 @@ def pyx_to_dll(filename, ext = None, force_rebuild = 0,
filename = filename[:-len(extension)] + '.c' filename = filename[:-len(extension)] + '.c'
ext = Extension(name=modname, sources=[filename]) ext = Extension(name=modname, sources=[filename])
if setup_args is None:
setup_args = {}
if not pyxbuild_dir: if not pyxbuild_dir:
pyxbuild_dir = os.path.join(path, "_pyxbld") pyxbuild_dir = os.path.join(path, "_pyxbld")
...@@ -151,6 +153,7 @@ def pyx_to_dll(filename, ext = None, force_rebuild = 0, ...@@ -151,6 +153,7 @@ def pyx_to_dll(filename, ext = None, force_rebuild = 0,
sys.stderr.write(error + "\n") sys.stderr.write(error + "\n")
raise raise
if __name__=="__main__": if __name__=="__main__":
pyx_to_dll("dummy.pyx") pyx_to_dll("dummy.pyx")
from . import test from . import test
......
...@@ -471,7 +471,7 @@ def _have_importers(): ...@@ -471,7 +471,7 @@ def _have_importers():
def install(pyximport=True, pyimport=False, build_dir=None, build_in_temp=True, def install(pyximport=True, pyimport=False, build_dir=None, build_in_temp=True,
setup_args={}, reload_support=False, setup_args=None, reload_support=False,
load_py_module_on_import_failure=False, inplace=False, load_py_module_on_import_failure=False, inplace=False,
language_level=None): language_level=None):
"""Main entry point. Call this to install the .pyx import hook in """Main entry point. Call this to install the .pyx import hook in
...@@ -518,6 +518,8 @@ def install(pyximport=True, pyimport=False, build_dir=None, build_in_temp=True, ...@@ -518,6 +518,8 @@ def install(pyximport=True, pyimport=False, build_dir=None, build_in_temp=True,
The default is to use the language level of the current Python The default is to use the language level of the current Python
runtime for .py files and Py2 for .pyx files. runtime for .py files and Py2 for .pyx files.
""" """
if setup_args is None:
setup_args = {}
if not build_dir: if not build_dir:
build_dir = os.path.join(os.path.expanduser('~'), '.pyxbld') build_dir = os.path.join(os.path.expanduser('~'), '.pyxbld')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment