.NET-like Attributes implemented as Python decorators.
Project description
pyAttributes
The Python package pyAttributes
offers implementations of .NET-like attributes
realized with Python decorators. The package also offers a mixin-class to ease
using classes having annotated methods.
In addition, an ArgParseAttributes
module is provided, which allows users to
describe complex argparse commond-line argument parser structures in a declarative
way.
Attributes can create a complex class hierarchy. This helps in finding and filtering for annotated properties and user-defined data. These search operations can be called globally on the attribute classes or locally within an annotated class. Therefore the provided helper-mixin should be inherited.
Use Cases
Annotate properties and user-defined data to methods.
Derived use cases:
- Describe a command line argument parser (argparse).
See pyAttributes Documentation -> ArgParse Examples - Mark class members for documentation.
See SphinxExtensions -> DocumentMemberAttribute
Planned implementations:
- Annotate user-defined data to classes.
- Describe test cases and test suits to get a cleaner syntax for Python's unit tests.
Technique
The annotated data is stored in an additional __dict__
entry for each
annotated method. By default the entry is called __pyattr__
. Multiple
attributes can be applied to the same method.
Creating new Attributes
Simple User-Defined Attribute
class SimpleAttribute(Attribute):
pass
User-Defined Attribute with Data
class DataAttribute(Attribute):
data: str = None
def __init__(self, data:str):
self.data = data
@property
def Data(self):
return self.data
Applying Attributes to Methods
class ProgramWithHelper(AttributeHelperMixin):
@SimpleAttribute()
def Method_1(self):
"""This method is marked as simple."""
@DataAttribute("hello world")
def Method_2(self):
"""This method as annotated data."""
Finding Methods with Attributes
Finding Methods with Global Search
methods = SimpleAttribute.GetMethods()
for method, attributes in methods.items():
print(method)
for attribute in attributes:
print(" ", attribute)
Finding Methods with Class-Wide Search
class ProgramWithHelper(AttributeHelperMixin):
@SimpleAttribute()
def Method_1(self):
"""This method is marked as simple."""
@DataAttribute("hello world")
def Method_2(self):
"""This method as annotated data."""
def test_GetMethods(self):
methods = self.GetMethods(filter=DataAttribute)
for method, attributes in methods.items():
print(method)
for attribute in attributes:
print(" ", attribute)
def test_GetAttributes(self):
attributes = self.GetAttributes(self.Method_1)
for attribute in attributes:
print(" ", attribute)
Contributors
- Patrick Lehmann (Maintainer)
License
This library is licensed under Apache License 2.0
SPDX-License-Identifier: Apache-2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for pyAttributes-2.0.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 48fe3ee8e81304a5ba66b0d1292a825a4e367556c813618a5de3ce63b85c4373 |
|
MD5 | 0946d53e2048585d4808c86bc4522a11 |
|
BLAKE2b-256 | eefe13d60ee37b08f94d5ad4a6dc8fe5e4f29130841b147cdada21d91d8eaa0d |