[pygccxml-development] Re : Multiple namespaces with the same name
Brought to you by:
mbaas,
roman_yakovenko
From: Vincent F. <vin...@gm...> - 2008-06-12 10:53:38
|
Ok, my classes were all generated in a namespace called postLib. I've found it and replaced code by : def rename_in_namespace(mb, nameList): for namespaceName in nameList: nspace = mb.namespace('postLib').namespace(namespaceName, recursive=False) for clz in nspace.classes(): clz.rename(namespaceName.capitalize() + clz.name.capitalize()) This point is working now and I can see the light! I'll have to fully understand call_policies to finish wrapping the whole library. I'll read the docs again and again :) I open a new subject for the next little problem. Thans a lot! 2008/6/12, Roman Yakovenko <rom...@gm...>: > On Thu, Jun 12, 2008 at 11:11 AM, Vincent Ferries > <vin...@gm...> wrote: >> I'm renaming most of my classes to avoid them to override themselves >> like explained in an other subject. >> >> In order to achieve this I coded following functions which prefix the >> classes in python with their namespace names. >> >> >> rename_in_namespace(mb, ['nastran', 'samcef', 'generic', 'cla']) >> >> #Writing code to file. >> mb.split_module(settings.generated_files_dir) >> >> >> def rename_in_namespace(mb, nameList): >> for namespaceName in nameList: >> nspace = mb.global_ns.namespace(namespaceName) >> for clz in nspace.classes(): >> clz.rename(namespaceName.capitalize() + clz.name.capitalize()) >> >> >> >> There isn't apparently any way to get the name of the namespace the >> class is in, > > Did you read the code I posted? > clz.parent will give you reference to the parent scope. In your case > this will return reference to the namespace > > You also can use clz.decl_string, which will return full name ::X::Y::x > >> but it's not right here the problem, I know their names >> explicitely. > > It is up to you > >> When I try to generate the wrapper code, I'm encountering following errors >> : >> >> >> Traceback (most recent call last): >> File "generate_code.py", line 73, in ? >> export() >> File "generate_code.py", line 59, in export >> rename_in_namespace(mb, ['nastran', 'samcef', 'generic', 'cla']) >> File "generate_code.py", line 67, in rename_in_namespace >> nspace = mb.global_ns.namespace(namespaceName) >> File >> "/usr/lib/python2.4/site-packages/pygccxml/declarations/namespace.py", >> line 74, in namespace >> , recursive=recursive ) >> File >> "/usr/lib/python2.4/site-packages/pygccxml/declarations/scopedef.py", >> line 343, in _find_single >> found = matcher_module.matcher.get_single( matcher, decls, False ) >> File "/usr/lib/python2.4/site-packages/pygccxml/declarations/matcher.py", >> line 81, in get_single >> raise matcher.multiple_declarations_found_t( decl_matcher ) >> pygccxml.declarations.matcher.multiple_declarations_found_t: Multiple >> declarations has been found. matcher: [(decl type==namespace_t) and >> (name==nastran)] >> >> >> >> Even if the same namespace is defined many times, the delarations >> should complete themselves, not redefine each other right? > > Right, but this functionality is missing in Py++, but as you already > saw it is pretty easy to implement it in the user script. > >> Why do I have this error? > > Because you have multiple namespaces named "nastran". I think next > solution will work for you: > > mb = module_builder_t( ... ) > gns = mb.global_ns > > nastran = gns.namespace( "nastran", recursive=False ) > > This will search for namespace "nastran" under the global one. It will > not look under other namespaces. > > -- > Roman Yakovenko > C++ Python language binding > http://www.language-binding.net/ > |