On 20 May 2013 15:12, Garth N. Wells <gn...@cam.ac.uk> wrote: > On 20 May 2013 15:06, Florian Rathgeber <florian.rathge...@gmail.com> > wrote: > > On 20/05/13 15:03, Anders Logg wrote: > >> On Mon, May 20, 2013 at 02:58:53PM +0100, Florian Rathgeber wrote: > >>> On 20/05/13 14:49, Garth N. Wells wrote: > >>>> On 20 May 2013 14:33, Anders Logg <l...@simula.no> wrote: > >>>>> On Mon, May 20, 2013 at 01:09:20PM +0100, Garth N. Wells wrote: > >>>>>> On 20 May 2013 12:44, David Ham <david....@imperial.ac.uk> wrote: > >>>>>>> Hi all, > >>>>>>> > >>>>>>> I'm writing Dolfin-compatible wrappers for PyOP2 as previously > advertised at > >>>>>>> FEniCS '13, which is causing me to bump into one of the > "interesting" quirks > >>>>>>> of the Python Dolfin API. Lots of things which would appear to > naturally be > >>>>>>> properties are actually methods and have to be called to be > accessed. For > >>>>>>> one among many, many examples, consider the value_size method of a > Function. > >>>>>>> This is accessed with: > >>>>>>> > >>>>>>> f.value_size() > >>>>>>> > >>>>>>> while > >>>>>>> > >>>>>>> f.value_size > >>>>>>> > >>>>>>> would seem more natural. Given the existence of the @property > decorator in > >>>>>>> standard Python which translates the former into the latter, this > is > >>>>>>> particularly mysterious. Is there a reason why this is done in > Dolfin? > >>>>>>> > >>>>>> > >>>>>> A few of us discussed this in January. I agree that the latter is > cleaner. > >>>>>> > >>>>>> First point, the Python interface is largely generated > automatically, > >>>>>> so that's our starting position. We would save on C++ code and get > the > >>>>>> syntax ' f.value_size' in many cases by not accessing member data > via > >>>>>> functions. I like skipping the function, and have been doing so > lately > >>>>>> with new code. The issue we discussed in January was backwards > >>>>>> compatibility - we could make a lot of C++ changes to get the syntax > >>>>>> 'f.size', but users would have to update their code (this point > >>>>>> bothers me less than it does others :)). > >>>>>> > >>>>>> In some cases we need a method, e.g. to get the size of a vector > from > >>>>>> a linear algebra backend. Storing the size in a wrapper is error > >>>>>> prone. > >>>>>> > >>>>>> In summary, the reason for the interface in some parts is > >>>>>> history/convention (with no technical reason), and in other cases > it's > >>>>>> a method for technical reasons. We could move more towards direct > >>>>>> access to member data. > >>>>> > >>>>> I don't agree with these conlusions. > >>>>> > >>>>> The reasons for the use of methods are: > >>> > >>> I think David didn't argue for direct access to member data (as in > >>> access to the C++ members), or in fact about changing the C++ layer at > >>> all. Rather we would like the semantic attribute access on Python layer > >>> provided by @property, which I think circumvents most of the issue > >>> Anders raises (note again I'm only talking about the Python interface): > >>> > >>>>> 1. Tradition: following some C++ guidelines we read 10 years back > that > >>>>> member data should never be accessed directly. > >>>> > >>>> It's done at times in the STL, e.g std::pair. > >>> > >>> One reason of using @property is not accessing member data directly. > >>> > >>>>> 2. Safety: Being able to access member variables means they can be > >>>>> changed from the outside (for a non-const object). This might lead to > >>>>> all kinds of unwanted behavior. A member variable can rarely be > >>>>> changed safely without changing a whole bunch of other data. > >>>>> > >>>> > >>>> If the data must be hidden, then it can be hidden behind a function. > >>>> Otherwise, if the object is const, then member data cannot be changed > >>>> and only const functions can be called on the data. > >>>> Something that would make things cleaner around the code would be to > >>>> let more objects have immutable data (e.g., not allow Vector > >>>> resizing), which allows some member data to be made const. > >>>> > >>>> At present we have annoying code duplication in numerous classes to > >>>> provide const and non-const access functions. > >>> > >>> @property is read-only be default. You can also define a setter, which > >>> would then be able to take care of changing all the other data. > >>> > >>>>> 3. Consistency: Sometimes, there is no member data to be accessed but > >>>>> it gets computed or extracted by the accessor function. This means if > >>>>> we moved to more access of member data, there would be mix of both > and > >>>>> it would be confusing and inconsistent. > >>>> > >>>> This is a major plus to accessing data directly. It makes explicit > >>>> that accessing a data member involves no computation. > >>> > >>> With @property you would keep the accessor function as it is but access > >>> it as if it were a property. In addition, if the access involves > >>> expensive computation that would only need to be done once, it can be > >>> cached directly on the attribute using e.g. cached_property: > >>> http://www.toofishes.net/blog/python-cached-property-decorator/ > >>> > >>>>> On top of theses strong reasons (2 + 3), we would also break the > >>>>> interface. > >>>> > >>>> Which is a drawback. > >>> > >>> Yes, also using @property would be an interface-breaking change. > >> > >> I guess it's not possible to have both? > > > > Not in Python, since there is no way to overload functions. The property > > would override the function of the same name. > > > > I'm not keen on additions that diverge the C++ and Python interfaces, > or changes that require more Swig glue or Python wrappers than are > absolutely necessary. It more than doubles the work (2 x testing, 2 x > documentation, plus making sure both interfaces do the same thing). > > Garth > > I think this is rather weak divergence: it's on the level of Python syntax looking different from C++ syntax. If I understand the swig process correctly (and I may not), this involves a change to the recipe for generating code, rather than more wrappers.
> > >> -- > >> Anders > > > _______________________________________________ > fenics mailing list > fenics@fenicsproject.org > http://fenicsproject.org/mailman/listinfo/fenics > -- Dr David Ham Department of Computing Imperial College London http://www.imperial.ac.uk/people/david.ham
_______________________________________________ fenics mailing list fenics@fenicsproject.org http://fenicsproject.org/mailman/listinfo/fenics