Skip to content

martinblech/pyfpm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

92 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

pyfpm

pyfpm stands for PYthon Functional Pattern Matching. It's been heavily inspired by the Pattern Matching and Case Classes implementation in Scala.

Build status at Travis CI: Build Status

Usage

With pyfpm you can unpack objects using the Unpacker class:

unpacker = Unpacker()
unpacker('head :: tail') << (1, 2, 3)
unpacker.head # 1
unpacker.tail # (2, 3)

or function parameters using the match_args decorator:

@match_args('[x:str, [y:int, z:int]]')
def match(x, y, z):
    return (x, y, z)

match('abc', (1, 2)) # ('abc', 1, 2)

You can also create simple matchers with lambda expressions using the Matcher class:

what_is_it = Matcher([
    ('_:int', lambda: 'an int'),
    ('_:str', lambda: 'a string'),
    ('x', lambda x: 'something else: %s' % x),
    ])

what_is_it(10)    # 'an int'
what_is_it('abc') # 'a string'
what_is_it({})    # 'something else: {}'

or more complex ones using the Matcher.handler decorator:

parse_options = Matcher()
@parse_options.handler("['-h'|'--help', None]")
def help():
    return 'help'
@parse_options.handler("['-o'|'--optim', level:int] if 1<=level<=5")
def set_optimization(level):
    return 'optimization level set to %d' % level
@parse_options.handler("['-o'|'--optim', bad_level]")
def bad_optimization(bad_level):
    return 'bad optimization level: %s' % bad_level
@parse_options.handler('x')
def unknown_options(x):
    return 'unknown options: %s' % repr(x)

parse_options(('-h', None))     # 'help'
parse_options(('--help', None)) # 'help'
parse_options(('-o', 3))        # 'optimization level set to 3'
parse_options(('-o', 0))        # 'bad optimization level: 0'
parse_options(('-v', 'x'))      # "unknown options: ('-v', 'x')"

For more information, see the files in the examples directory alongside the links within them, or read the docs.

Installation

pyfpm is in PyPi:

$ pip install pyfpm

About

Scala-like functional pattern matching in Python

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages