def _gen_constructor(name, name_mangled, classname, args, doc=None, cpppxd_filename=None, inst_name="self._inst"): argfill = ", ".join(['self'] + [a[0] for a in args if 2 == len(a)] + \ ["{0}={1}".format(a[0], a[2]) for a in args if 3 == len(a)]) lines = ['def {0}({1}):'.format(name_mangled, argfill)] lines += [] if doc is None else indent('\"\"\"{0}\"\"\"'.format(doc), join=False) decls = [] argbodies = [] argrtns = {} for a in args: adecl, abody, artn = cython_py2c(a[0], a[1]) if adecl is not None: decls += indent(adecl, join=False) if abody is not None: argbodies += indent(abody, join=False) argrtns[a[0]] = artn argvals = ', '.join([argrtns[a[0]] for a in args]) classname = classname if cpppxd_filename is None else \ "{0}.{1}".format(cpppxd_filename.rsplit('.', 1)[0], classname) fcall = 'self._inst = new {0}({1})'.format(classname, argvals) func_call = indent(fcall, join=False) lines += decls lines += argbodies lines += func_call lines += ['', ""] return lines
def _gen_property_set(name, t, inst_name="self._inst", cached_name=None): """This generates a Cython property setter for a variable of a given name and type.""" lines = ['def __set__(self, value):'] decl, body, rtn = cython_py2c('value', t) if decl is not None: lines += indent(decl, join=False) if body is not None: lines += indent(body, join=False) lines += indent("{0}.{1} = {2}".format(inst_name, name, rtn), join=False) if cached_name is not None: lines += indent("{0} = None".format(cached_name), join=False) return lines
def _gen_method(name, name_mangled, args, rtn, doc=None, inst_name="self._inst"): argfill = ", ".join(['self'] + [a[0] for a in args if 2 == len(a)] + \ ["{0}={1}".format(a[0], a[2]) for a in args if 3 == len(a)]) lines = ['def {0}({1}):'.format(name_mangled, argfill)] lines += [] if doc is None else indent('\"\"\"{0}\"\"\"'.format(doc), join=False) decls = [] argbodies = [] argrtns = {} for a in args: adecl, abody, artn = cython_py2c(a[0], a[1]) if adecl is not None: decls += indent(adecl, join=False) if abody is not None: argbodies += indent(abody, join=False) argrtns[a[0]] = artn rtype = cython_ctype(rtn) hasrtn = rtype not in set(['None', None, 'NULL', 'void']) argvals = ', '.join([argrtns[a[0]] for a in args]) fcall = '{0}.{1}({2})'.format(inst_name, name, argvals) if hasrtn: fcdecl, fcbody, fcrtn, fccached = cython_c2py('rtnval', rtn, cached=False) decls += indent("cdef {0} {1}".format(rtype, 'rtnval'), join=False) func_call = indent('rtnval = {0}'.format(fcall), join=False) if fcdecl is not None: decls += indent(fcdecl, join=False) if fcbody is not None: func_call += indent(fcbody, join=False) func_rtn = indent("return {0}".format(fcrtn), join=False) else: func_call = indent(fcall, join=False) func_rtn = [] lines += decls lines += argbodies lines += func_call lines += func_rtn lines += ['', ""] return lines
def check_cython_py2c(name, t, inst_name, exp): obs = ts.cython_py2c(name, t, inst_name=inst_name) assert_equal(obs, exp)