Skip to main content

Commenting sucks so let your code do it for you with Guava like preconditions that also actually do something.

Project description

Build Status

Commenting sucks so let your code do it for you with preconditions that actually do something.

Examples:

from pyconditions.pre import *

@Between( "b", 1, 10 )
def divideAbyB( a, b )
  return a / b

@NotNone( "a" )
@Between( "a", "a", "n" )
@NotNone( "b" )
@Between( "b", "n", "z" )
def concat( a, b ):
  return a + b

@Custom( "a", lambda x: x % 2 == 0 )
@Custom( "b", lambda x: not x % 2 == 0 )
def evenOdd( a, b ):
  return a * b

The documenting is there with the code it self, and if you violate the preconditions then a PyCondition exception is thrown with a much nicer error message than broken code.

evenOdd( 3, 1 )
pyconditions.exceptions.PyCondition: 3 did not pass the custom condition for parameter 'a' in function evenOdd

How about some postconditions?

from pyconditions.post import *

@NotNone()
def test( a ):
  return a

@Custom( lambda a: a % 2 == 0 )
def even( a ):
  return a
test( None )
pyconditions.exception.PyCondition: The return value for uber.awesome.project.test was None

You can also mix the two as well.

from pyconditions import pre
from pyconditions import post

@pre.Custom( "a", lamda a: a % 2 == 0 )
@post.Custom( lambda a: a % 2 == 0 )
def superSafeEven( a ):
  return a

Want some class invariant shenanigans?

from pyconditions.invariant import Invariant, FieldsNotNone
@FieldsNotNone( [ "test" ] )
class Test:
    def __init__( self ):
            self.test = 1
    def add( self ):
            return self.test + 1
    def set( self, v ):
            self.test = v

t = Test()
print t.add()
t.set( None )

That last call to add will cause the invariant to fail and thus throw the following:

pyconditions.exceptions.PyCondition: Field "test" was None when it should not have been in invariant "notNone"

Need a custom invariant?

from pyconditions.invariant import CustomInvariant
def invariant( self ):
   return self.test == 1

@CustomInvariant( "test", invariant )
class Test( object ):
   def __init__( self ):
           self.test = 1
   def method1( self ):
           self.test

This is great but the conditions slow my code down a lot? No problem.

from pyconditions.stage import Stage

stage = Stage()
stage.prod()

Just set that somewhere in your code and you’ll be fine. There is still some overhead, mainly there will be two function calls for each method, the wrapper and the original function. But, for stacked Preconditions and Invariants it will not execute into the other conditions and invraiants when prod is called. If you want to go back to Dev then call dev().

Have conditions you want added? Open a PR with code.

Have an issue? Open a PR with fixed code.

Project details


Download files

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

Source Distribution

pyConditions-0.5.1.tar.gz (10.8 kB view details)

Uploaded Source

Built Distributions

pyConditions-0.5.1.macosx-10.9-intel.tar.gz (14.8 kB view details)

Uploaded Source

pyConditions-0.5.1.macosx-10.9-intel.exe (74.7 kB view details)

Uploaded Source

File details

Details for the file pyConditions-0.5.1.tar.gz.

File metadata

File hashes

Hashes for pyConditions-0.5.1.tar.gz
Algorithm Hash digest
SHA256 52689a8ab7966ec0bba75375c19f8fe0e1af5f1673cb18bfedf21ef8b20809f6
MD5 9d0b749c5dd3f09d3c15f743e7708476
BLAKE2b-256 4e9162015092094ed17078b9259879f616010a26c01b568de36f8eb72c5473c0

See more details on using hashes here.

File details

Details for the file pyConditions-0.5.1.macosx-10.9-intel.tar.gz.

File metadata

File hashes

Hashes for pyConditions-0.5.1.macosx-10.9-intel.tar.gz
Algorithm Hash digest
SHA256 c0666756622357bff40bc874e4f819a14a37830eb5993f62e373d1a32db77ca9
MD5 a69c01271bbcea10e519cbfc772cf263
BLAKE2b-256 e48e312a17a81bee577a1dcc7c0853579fd581b5b914ea591220114120ec0d89

See more details on using hashes here.

File details

Details for the file pyConditions-0.5.1.macosx-10.9-intel.exe.

File metadata

File hashes

Hashes for pyConditions-0.5.1.macosx-10.9-intel.exe
Algorithm Hash digest
SHA256 14be4b4a0eeb4f4c93974ea033192509496e7a3b30c4b7e6fac5dfb258e7b31f
MD5 6efcdd44ed9a2eb8c09fb0abd9dbc4fd
BLAKE2b-256 34e9e4ce7250f6ebda4578ca48ae62c1f7b68d7ea404ed8427a136de7fea28aa

See more details on using hashes here.

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