Package contains interfaces to enforce PEP8 coding conventions.
Package allows to enforce certain kinds of PEP-8 convention coding styles (or perform overall code diagnostics). It aims to help maintain programmers sanity while making any code changes. In large object-oriented programs, it can sometimes be useful to put class definitions under control of a metaclass that are used to alert programmers to potential problems.
Most important that package enforces you to write clear and concise pythonic code.
- python 3.6, 3.7, 3.8, 3.9
Please run following script to obtain latest package from PYPI:
pip install enforce-pep8 ✨ 🍰 ✨
Bad class name: lowercase class name is defined
from punish.style import AbstractStyle class stylish(AbstractStyle): def name(self) -> None: pass Traceback (most recent call last): File "<stdin>", line 1, in <module> punish.style.BadClassNameError Class name 'stylish' specified in lowercase. Consider to use camelcase style!
Bad attribute name: camelcase method name is defined
from punish.style import AbstractStyle class Stylish(AbstractStyle): def showName(self) -> None: pass Traceback (most recent call last): File "<stdin>", line 1, in <module> punish.style.BadAttributeNameError Bad attribute name is specified: 'Stylish:showName'. Consider to use lowercase style: 'Stylish:showname'!
Bad method signature: method signature mismatch within base and child classes
from punish.style import AbstractStyle class Stylish(AbstractStyle): def show(self, indent: str = ":") -> str: pass class SoStylish(Stylish): def show(self, indent: str = ":", not_expected_argument: bool = False) -> str: pass Traceback (most recent call last): File "<stdin>", line 1, in <module> punish.style.SignatureError Signature mismatch in 'SoStylish.show', (self, indent: str = ':') -> str != (self, indent: str = ':', not_expected_argument: bool = False) -> str
Duplicated attribute name: defined two methods with same name
from punish.style import AbstractStyle class Stylish(AbstractStyle): def name(self) -> None: pass def name(self) -> None: pass Traceback (most recent call last): File "<stdin>", line 5, in Stylish punish.style.DuplicateAttributeError: 'name' attribute is already defined in 'Stylish' class
Bad argument type: not expected type is passed to the argument
from punish.type import OrderTypedMeta, String, Typed class Car(metaclass=OrderTypedMeta): color: Typed = String() def __init__(self, color: str) -> None: self.color = color car: Car = Car(color=23) Traceback (most recent call last): File "<stdin>", line 5, in __init__ TypeError: Expected '<class 'str'>' type for 'color' attribute
Bad setter type: not expected type for setter argument
from punish.type import typed_property class Person: name: property = typed_property("name", str) age: property = typed_property("age", int) def __init__(self, name: str, age: int) -> None: self._name = name self._age = age person: Person = Person(name="Luke", age=22) person.age = None Traceback (most recent call last): File "<stdin>", line 5, in __init__ TypeError: 'age' argument must be a '<class 'int'>' type
Frozen class attributes: it is forbidden to modify class attributes
from punish.type import FrozenMeta class Bio(metaclass=FrozenMeta): name: str = 'Luke' company: str = 'Cisco' bio = Bio() bio.name = 'Amir' dataclasses.FrozenInstanceError: cannot assign to field 'name'
git clone firstname.lastname@example.org:vyahello/enforce-pep8.git pip install -e .
Or using direct source:
pip install git+https://email@example.com
Please execute command below to run unittests with
Project has Travis CI integration using .travis.yml file thus code analysis (
pydocstyle) and unittests (
pytest) will be run automatically after every made change to the repository.
To be able to run code analysis, please execute command below:
Please check changelog file to get more details about actual versions and it's release notes.
Author – Volodymyr Yahello. Please check authors file for more details.
Distributed under the
MIT license. See LICENSE for more information.
You can reach out me at:
I would highly appreciate any contribution and support. If you are interested to add your ideas into project please follow next simple steps:
- Clone the repository
gitfor the first time after cloning with your
pip install -r requirements.txtto install all project dependencies
pip install -r requirements-dev.txtto install all development project dependencies
- Create your feature branch (git checkout -b feature/fooBar)
- Commit your changes (git commit -am 'Add some fooBar')
- Push to the branch (git push origin feature/fooBar)
- Create a new Pull Request
Project is inspired mainly by pythonic PEP8 code style reflected at https://www.python.org/dev/peps/pep-0008. Also decent ideas are described in https://github.com/zedr/clean-code-python project.
In general, future releases will contain API implementations from mentioned style guides above.
All recent activities and ideas are described at project issues page. If you have ideas you want to change/implement please do not hesitate and create an issue.
Release history Release notifications | RSS feed
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Hashes for enforce_pep8-0.0.12-py3-none-any.whl