https://github.com/tbhartman/doorbell
You have a visitor.
https://github.com/tbhartman/doorbell
python visitor-pattern
Last synced: 5 months ago
JSON representation
You have a visitor.
- Host: GitHub
- URL: https://github.com/tbhartman/doorbell
- Owner: tbhartman
- License: mit
- Created: 2018-11-02T15:29:50.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2018-11-17T03:02:41.000Z (over 7 years ago)
- Last Synced: 2025-09-27T19:26:58.256Z (9 months ago)
- Topics: python, visitor-pattern
- Language: Python
- Homepage:
- Size: 53.7 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
README
doorbell
========
[](https://travis-ci.com/tbhartman/doorbell)
[](https://coveralls.io/github/tbhartman/doorbell)
[](https://readthedocs.org/projects/doorbell)
[](https://pypi.org/project/doorbell)

`doorbell` provides a visitor pattern implementation for Python.
Usage
=====
Define an object that receives a visitor. For example, in an expression
evaluator, create classes for a value and add and multiply operators:
```python
@doorbell.Visitee.create
class Value:
def __init__(self, value=0):
self.value = value
self.children = []
@doorbell.Visitee.create
class Add(Value):
pass
@doorbell.Visitee.create('Multiply')
class Mult(Add):
pass
```
Then create a visitor class to evaluate:
```python
class Visitor(doorbell.CascadingVisitor):
def visit_Value(self, obj, children):
return obj.value
def visit_Add(self, obj, children):
return functools.reduce(operator.add, children, 0)
def visit_Multiply(self, obj, children):
return functools.reduce(operator.mul, children, 1)
```
Create an object and visit it:
```python
// (1+1)*(1+1)
one = Value(1)
add = Add()
add.children.extend((one, one))
mult = Mult()
mult.children.extend((add, add))
v = Visitor()
r = mult.accept(v)
assert r == 4
```
Installation
============
`pip install doorbell`
License
=======
`doorbell` is free software and licensed under the MIT License.