Skip to main content

The missing switch statement

Project description

https://travis-ci.org/canni/switch.svg?branch=v1.0.3 https://coveralls.io/repos/canni/switch/badge.png?branch=v1.0.3 Downloads

Switch

Changelog

  • v1.0.3: Maintenance release, no significant code changes
  • v1.0.2: 100% unit test coverage

Simple example:

from switch import Switch

def simple_example(val):
    values = []

    with Switch(val) as case:
        if case(1):
            values.append('Found 1')

        if case(2):
            values.append('Found 2')

    return values

assert simple_example(1) == ['Found 1']
assert simple_example(2) == ['Found 2']
assert simple_example('anything else') == []

Simple example with default case:

from switch import Switch

def simple_example_with_default(val):
    values = []

    with Switch(val) as case:
        if case(1):
            values.append('Found 1')

        if case(2):
            values.append('Found 2')

        if case.default:
            values.append('No love for 1 or 2?')

    return values

assert simple_example_with_default(1) == ['Found 1']
assert simple_example_with_default(2) == ['Found 2']
assert simple_example_with_default('anything else') == ['No love for 1 or 2?']

Fall through example:

from switch import Switch

def fall_through_example(val):
    values = []

    with Switch(val) as case:
        if case(1, fall_through=True):
            values.append('Found 1')

        if case(2):
            values.append('Found 2')

        if case.default:
            values.append('No love for 1 or 2?')

    return values

assert fall_through_example(1) == ['Found 1', 'Found 2']
assert fall_through_example(2) == ['Found 2']
assert fall_through_example('anything else') == ['No love for 1 or 2?']

Cases can have callable test:

from switch import Switch

def ouh_callable_too(val):
    values = []

    with Switch(val) as case:
        if case(1):
            values.append('Found 1')

        if case.call(lambda v: v < 100):
            values.append('Found <100')

        if case.default:
            values.append('No love for anything lower than 100?')

    return values

assert ouh_callable_too(1) == ['Found 1']
assert ouh_callable_too(50) == ['Found <100']
assert ouh_callable_too('anything else') == ['No love for anything lower than 100?']

Fall through by default:

from switch import CSwitch, Switch

def fall_through_by_default(val):
    values = []

    with Switch(val, fall_through=True) as case:
        if case(1):
            values.append('Found 1')

        if case(2):
            values.append('Found 2')

        if case(3, fall_through=False):
            values.append('Found 3')

        if case(4):
            values.append('Found 4')

        if case.default:
            values.append('No love for 1, 2, 3 or 4?')

    return values


def cswitch_shortcut(val):
    values = []

    with CSwitch(val) as case:
        if case(1):
            values.append('Found 1')

        if case(2):
            values.append('Found 2')

        if case(3, fall_through=False):
            values.append('Found 3')

        if case(4):
            values.append('Found 4')

        if case.default:
            values.append('No love for 1, 2, 3 or 4?')

    return values

assert fall_through_by_default(1) == ['Found 1', 'Found 2', 'Found 3']
assert fall_through_by_default(2) == ['Found 2', 'Found 3']
assert fall_through_by_default(3) == ['Found 3']
assert fall_through_by_default(4) == ['Found 4']
assert fall_through_by_default('anything else') == ['No love for 1, 2, 3 or 4?']

assert cswitch_shortcut(1) == fall_through_by_default(1)
assert cswitch_shortcut(2) == fall_through_by_default(2)
assert cswitch_shortcut(3) == fall_through_by_default(3)
assert cswitch_shortcut(4) == fall_through_by_default(4)
assert cswitch_shortcut('anything else') == fall_through_by_default('anything else')

Having a case after a default is a bad thing:

  • Unless some case executes early and finishes without fall through.
from switch import Switch

def case_after_default_is_baad(val):
    values = []

    with Switch(val) as case:
        if case(1):
            values.append('Found 1')

        if case.default:
            values.append('Found default')

        if case('this is baad'):
            values.append('Should not happen!')

    return values

assert case_after_default_is_baad(1) == ['Found 1']

try:
    case_after_default_is_baad('this is baad')
    assert False
except SyntaxError:
    assert True

Project details


Download files

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

Files for switch, version 1.0.3
Filename, size File type Python version Upload date Hashes
Filename, size switch-1.0.3.tar.gz (3.8 kB) File type Source Python version None Upload date Hashes View
Filename, size switch-1.0.3.zip (5.7 kB) File type Source Python version None Upload date Hashes View

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring DigiCert DigiCert EV certificate Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page