Skip to main content

Package contains interfaces to enforce PEP8 coding conventions.

Project description

made-with-python Build Status Coverage Status Code style: black Checked with pylint Checked with flake8 Checked with pydocstyle Checked with mypy License EO principles respected here PyPI version PyPI pyversions CodeFactor PyPi downloads Downloads

Enforce PEP-8

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
✨ 🍰 

Quick start

Bad class name: lowercase class name is defined

from import AbstractStyle

class stylish(AbstractStyle):
     def name(self) -> None:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Class name 'stylish' specified in lowercase. Consider to use camelcase style!

Bad attribute name: camelcase method name is defined

from import AbstractStyle

class Stylish(AbstractStyle):
     def showName(self) -> None:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
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 import AbstractStyle

class Stylish(AbstractStyle):
     def show(self, indent: str = ":") -> str:

class SoStylish(Stylish):
    def show(self, indent: str = ":", not_expected_argument: bool = False) -> str:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Signature mismatch in '', 
(self, indent: str = ':') -> str != (self, indent: str = ':', not_expected_argument: bool = False) -> str 

Duplicated attribute name: defined two methods with same name

from import AbstractStyle

class Stylish(AbstractStyle):
    def name(self) -> None:

    def name(self) -> None:

Traceback (most recent call last):
  File "<stdin>", line 5, in Stylish '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() = 'Amir'
dataclasses.FrozenInstanceError: cannot assign to field 'name'

Source code

git clone
pip install -e .

Or using direct source:

pip install git+

⬆ back to top

Development notes


Please execute command below to run unittests with pytest tool:



Project has Travis CI integration using .travis.yml file thus code analysis (black, pylint, flake8, mypy, 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:


Release notes

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:

  1. Clone the repository
  2. Configure git for the first time after cloning with your name and email
  3. pip install -r requirements.txt to install all project dependencies
  4. pip install -r requirements-dev.txt to install all development project dependencies
  5. Create your feature branch (git checkout -b feature/fooBar)
  6. Commit your changes (git commit -am 'Add some fooBar')
  7. Push to the branch (git push origin feature/fooBar)
  8. Create a new Pull Request

What's next

Project is inspired mainly by pythonic PEP8 code style reflected at Also decent ideas are described in 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.

⬆ back to top

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

enforce_pep8-0.0.12-py3-none-any.whl (11.7 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page