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 = 2

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.3.5.tar.gz (9.6 kB view details)

Uploaded Source

Built Distribution

pyConditions-0.3.5.macosx-10.9-intel.exe (72.8 kB view details)

Uploaded Source

File details

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

File metadata

File hashes

Hashes for pyConditions-0.3.5.tar.gz
Algorithm Hash digest
SHA256 f4f33851f75b413939e60c8c9288ca5f2c6514f74b1aa76672672c8cb1f4aaf2
MD5 eae27712b108ab4fb9db2d67ede7eaff
BLAKE2b-256 00d1a6227d5e7b2fbff67920c001b08d5e16a0d4bcb1af294c3be36988b658bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyConditions-0.3.5.macosx-10.9-intel.exe
Algorithm Hash digest
SHA256 8fa4ee848411a8dc1c991e262b215e5f52ce9651fa00829ee882e1d026c44140
MD5 6e96ddd0b16df91f3fb492749e56ee25
BLAKE2b-256 24949bf23a940233b349b62df57e3ea46dcc7bd4c9e30918620717e3a18e7a17

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