sphinx_typesafe is a decorator which enables dynamic type checking on Python method and function calls. It works in conjunction with Sphinx-style docstrings, which makes it particularly convenient for keeping the code documentation up-to-date with the code actually being executed.
Features is a Nutshell
The decorator can be attached to any function or method.
Raises TypeError if types of arguments do not match the specification.
Raises TypeError if type of return value does not match the specification.
Performs dynamic type checking.
Python2
Since function annotations are not available in Python2 the way type checking for Python2 is a documentation convention for parameters based on the info field lists of sphinx. So even when you don’t use type checking you can use it to generate documentation.
Syntax for Python2 using sphinx style docstrings
This is the preferred way since you will be also documenting your code.
from sphinx_typesafe.typesafe import typesafe
@typesafe
def foo(param_a, param_b, param_c):
"""
:type param_a: types.StringType
:type param_b: types.IntType
:type param_c: types.NotImplementedType
:rtype: types.BooleanType
"""
# Do Something
return True
Syntax for Python2 using decorator arguments
This is an alternative approach, useful in circunstances where Sphinx-style documentation is not allowed or desired, for whatever reason.
from sphinx_typesafe.typesafe import typesafe
@typesafe( { 'param_a' : 'str',
'param_b' : 'types.IntType',
'param_c' : 'own_module.OwnType',
'return' : 'bool' } )
def foo(param_a, param_b, param_c):
""" Some Docstring Info """
# Do Something
return True
You can use any Python type
So if you have defined a Point class in module mod1 like below:
# File: mod1.py
class Point(object):
def __init__(self, x = None, y = None):
""" Initialize the Point. Can be used to give x,y directly."""
self.x = x
self.y = y
then you can employ this type in your code like this:
from mod1 import Point
from sphinx_typesafe.typesafe import typesafe
@typesafe
def foo(afunc):
"""
:type afunc: mod1.Point
:rtype: types.BooleanType
"""
return True
Python3
The base technique is the Function Annotations proposed in PEP-3107 which is documented in Python3 What’s New (see section New Syntax).
Syntax for Python3
from sphinx_typesafe.typesafe import typesafe
@typesafe
def foo(param_a: str, param_b: int) -> bool:
# Do Something
return True
The @typesafe decorator will then check all arguments dynamically whenever the foo is called for valid types.
As a quoting remark from the PEP 3107: “All annotated parameter types can be any python expression.”, but for typechecking only types make sense, though.
The idea and parts of the implementation were inspired by the book: Pro Python (Expert’s Voice in Open Source)
Building from source
Start from a clean and minimalist virtual environment, for example:
$ pip list pip (1.4) setuptools (2.1) wsgiref (0.1.2)
Download sources and run test cases
$ git clone https://github.com/frgomes/sphinx_typesafe $ cd sphinx_typesafe $ python setup.py devtest && py.test
FAQ
Why it was called IcanHasTypeCheck ?
IcanHasTypeCheck (ICHTC), refers to the famous lolcats.
Why is now called sphinx_typesafe ?
Because typesafe tells immediatelly what it is about. Unfortunately, typesafe was already taken on PyPI, so sphinx_typesafe seemed to be a good alternative name which also relates to the documentation standard adopted.
Support
Please find links on the top of this page.
CHANGES
0.3 (13-feb-2014)
Several bugfixes and enhancements
better resolution of type names
fix support for methods
fix documentation
test suite now has 60 test cases
support for types.NoneType
more restrictive matching of documenation against parameters
support for ignoring type checking: types.NotImplementeType
exposing function get_class_type
0.2 (03-dec-2013)
Full code rewiew and rewrite by Richard Gomes <rgomes.info@gmail.com>
@typesafe is now a class
Code reorganization and some optimization
Preparing code for porting to Python3
New features
Added verification of return type of decorated functions
Bugfixes
Type resolver now finds types involving multiple nested modules
Type resolver assumes module ‘__builtin__’ for simple names, such as ‘bool’
Renamed to sphinx_typesafe
Documentation rewriten in reStructuredText
Added docs directory required by readthedocs.org
First version deployed onto PyPI
0.1
Original version of IcanHasTypeCheck (ICHTC) by Klaas <khz@tzi.org>
Metadata
Release files for sphinx_typesafe 0.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distributions (sdists)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| sphinx_typesafe-0.3.zip | 30.0 kB | Without provenance | Details | |
| sphinx_typesafe-0.3.tar.gz | 17.6 kB | Without provenance | Details |
Release files / sphinx_typesafe-0.3.zip
| Download URL | sphinx_typesafe-0.3.zip |
|---|---|
| Size | 30.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3b68cc76ec12ddc8e5b01983bfe6f1f5d8b9ee6447a6ced9162da28ef0a44f09
|
|
BLAKE2b-256 checksum How to use checksums |
5ba8a49415b4716215844cd1e25500c644490fc9c9e351b8cd4c8d65df34bea2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
Release files / sphinx_typesafe-0.3.tar.gz
| Download URL | sphinx_typesafe-0.3.tar.gz |
|---|---|
| Size | 17.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
99b091744613164e5a23b1766edd2e95ecb4c35e9c315165a9d619fcac34176f
|
|
BLAKE2b-256 checksum How to use checksums |
d5b944e129d005f03b364fdc241b846eaf8ba435dc89ff98fbc63997a33745a9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
Security for sphinx_typesafe 0.3
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.