Review Request: Add possibility to store Decorators for class- and function declarations

Sven Brauch svenbrauch at gmx.de
Thu Sep 1 21:26:39 UTC 2011



> On Aug. 27, 2011, 12:19 a.m., Milian Wolff wrote:
> > I have no clue about python: what is a decorator? the @staticmethod ? Then the def foo function definition should be marked static. What is the decorator trying to solve?
> 
> Sven Brauch wrote:
>     Hey,
>     
>     in python, you don't write "static int foo", but "def foo", and then foo = staticmethod(foo). The "staticmethod" function converts the "foo" function into a new one which is static. To simplify this, instead of
>     
>     class my_class():
>       def foo(): pass
>       foo = staticmethod(foo)
>     
>     you can also write
>     
>     class my_class():
>       @staticmethod
>       def foo(): pass
>     
>     Those two are equivalent. You can also define your own decorators, which take functions as arguments and return other functions. There's also a few predefined ones in python.
>     
>     Doesn't PHP also have that "@" syntax? Or is that just in docstrings?
>     
>     Whatever, kdev-python documentation files do something like this:
>     
>     @TypeContainer
>     class list():
>         @appendsType(0)
>         def append(arg0): pass
>     
>     This is the way to let my code know it should track the content type of "list" instances, and other decorators tell it which functions modify that content type.
> 
> Milian Wolff wrote:
>     well the static example doesn't need decorators, you just mark the function as static in the duchain
>     
>     php has no @ syntax, only in docstrings
>     
>     and I still don't get what the @ things in your list example are doing. Anyhow, I doubt this is required for other languages. Imo make it python-only for now until we find another language that has something like that.
>     
>     bye
> 
> Davide Simoncelli wrote:
>     If I'm not wrong Java uses decorators

Okay, so here's another example:

-----
>>> def decorate(obj):
...  obj.some_other_attribute = 42
...  obj.some_attribute = 1337
...  return obj
... 
>>> @decorate
... class my_class(): pass
... 
>>> my_instance = my_class()
>>> my_instance.some_attribute
1337
-----

The class definition construct is again equivalent to writing class my_class(): pass; my_class = decorate(my_class). A more useful example is this:

-----
def debug_return_value(func):
 def wrapper(*args, **kwargs):
  ret = func(*args, **kwargs)
  print ret
  return ret
 return wrapper

@debug_return_value
def my_func(arg):
 return [arg, arg]

my_result = my_func("Hello World!")
-----

The last line will, instead of just writing the return value of my_func into my_result, also print it on the screen, because my_func is replaced by the "wrapper" function by the decorator. Obviously, this is much more flexible than writing print statements all over the function.
I hope it is understandable from this what decorators can be used for.

--

Storing the decorators will be useful, if only for displaying them in the navigation widget.

I'm also okay with making this python-specific, but then I'd need some hints on subclassing data classes with appended lists, while adding more appended lists in the child class. Is this even possible? I didn't manage to do so yet, and I tried quite a few times.


- Sven


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
http://git.reviewboard.kde.org/r/102432/#review6041
-----------------------------------------------------------


On Aug. 25, 2011, 1:22 p.m., Sven Brauch wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> http://git.reviewboard.kde.org/r/102432/
> -----------------------------------------------------------
> 
> (Updated Aug. 25, 2011, 1:22 p.m.)
> 
> 
> Review request for KDevelop.
> 
> 
> Summary
> -------
> 
> This adds a list of Decorators to each class and function declaration, and a Decorator class which stores information about those decorators.
> This is currently relevant for the python language, which has a pattern like this:
> 
> class c():
>     @staticmethod
>     def foo():
>         pass
> 
> I didn't have an internet connection for research available, but I think other languages might have similar patterns, so this can go into kdevplatform.
> Also, even after several hours of experimentation I couldn't figure out how to inherit from a class which defines appended lists, adding another one... some documentation on that would be appreciated :)
> 
> 
> Diffs
> -----
> 
>   language/CMakeLists.txt 4399ebb 
>   language/duchain/classdeclaration.h 409a3a4 
>   language/duchain/classdeclaration.cpp 0670209 
>   language/duchain/decorator.h PRE-CREATION 
>   language/duchain/functiondeclaration.h 7f084a9 
>   language/duchain/functiondeclaration.cpp fb442dc 
> 
> Diff: http://git.reviewboard.kde.org/r/102432/diff
> 
> 
> Testing
> -------
> 
> 
> Thanks,
> 
> Sven
> 
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/kdevelop-devel/attachments/20110901/5df17e7a/attachment.html>


More information about the KDevelop-devel mailing list