← Back to team overview

dolfin team mailing list archive

Re: Strange error from function.py

 

2008/12/2 Anders Logg <logg@xxxxxxxxx>:
> On Tue, Dec 02, 2008 at 12:12:14PM +0100, Anders Logg wrote:
>> I've tried adding a new class Constant in function.py:
>>
>> class Constant(ffc.Constant, dolfin.cpp_Function):
>>
>>     def __init__(self, domain, value):
>>         "Create constant-valued function."
>>         print domain
>>         print value
>>         #ffc.Constant.__init__(self, domain)
>>         #dolfin.cpp_Constant.__init__(self, value)
>>
>> But I get the following error message:
>>
>>   File
>>   "/scratch/fenics/dolfin/dolfin-dev/local/lib/python2.5/site-packages/dolfin/function.py", line 411, in <module>
>>     class Constant(ffc.Constant, dolfin.cpp_Function):
>> TypeError: Error when calling the metaclass bases
>>     function() argument 1 must be code, not str
>>
>> How is this possible? There should be no metaclasses involved here
>> (except the built-in Python metaclass type that is always there).
>
> I get this error even if I just try to create a class named anything
> that inherits from ffc.Constant.
>
> Does the metaclass construction in function.py have side-effects?
>
> I don't remember if we discussed this before, but would it be possible
> (at least simpler) to instead define a simple Python function that
> returns a "function" instance:
>
> class FooFunction(ffc.Function, ...):
>    ...
> class BarFunction(dolfin.Function, ...):
>    ...
>
> def Function(V, *arg):
>
>    if foo:
>        return FooFunction(...)
>    elif bar:
>        return BarFunction(...)
>
> This seems to be an easier solution. It would still be dynamic.

The __metaclass__ attribute of Function doesn't have to be a type, it
can be any callable.

> The only drawback would be that we can't do
>
>  isinstace(v, Function)

As mentioned before, I see that as an advantage ;)

> This can be solved by creating an empty class FunctionBase that all
> the special types inherit from.
>
> --
> Anders


-- 
Martin


Follow ups

References