Skip to main content

README

Build Status

λamla is a performant functional programming library for python which supports mixing async and regular functions.

Installation: pip install gamla

API reference: https://gamla.readthedocs.io/

Basic example

gamla can help you turn this:

import dataclasses

@dataclasses.dataclass
class Person:
    age: int
    name: str

    def is_eligible(self):
        return self.age > 9


def get_names_eligible_for_vaccine(people):
    result = []
    for person in people:
        if person.is_eligible():
            result.append(person.name)
    return result

into this:

import dataclasses
from gamla import attrgetter, greater_than, compose_left, filter, map

@dataclasses.dataclass(frozen=True)
class Person:
    age: int
    name: str

is_eligible = compose_left(attrgetter("age"), greater_than(9))
get_names_eligible_for_vaccine = compose_left(filter(is_eligible), map(attrgetter("name")), list)

Is this a good thing? that's for you to decide.

The upside:

Functional programming is mainly about how to split your code into composable parts. Composability means that things are easy to move, replace or combine together like lego. It helps you identify recurring patterns (e.g. filter), factor them out and reuse them. If your generalizations are good, they free your mind to focus on the new logic. Concretely it saves a lot of code and helps a reader understand what a piece of code is doing. For example, if you are familir with what filter is, you don't have to squint and realize that an if and a for actually do a filtering pattern.

The downside:

Programming in this style in python means some tools won't be so useful (e.g. your debugger, static analysis tools).

Debugging anonymous compositions

gamla.debug

Classic breakpoints are less useful when working with compositions, as there isn't always a line of code to place the breakpoint on. Instead one can use gamla.debug and gamla.debug_exception.

gamla.debug can be used within pipelines and will provide a pdb breakpoint prompt where the value at this position can be referenced by x.

def increment(x):
    return x + 1

increment_twice = gamla.compose_left(increment, gamla.debug, increment)

increment_twice(1)

The above code will break with x being 2.

When you have a long pipeline and want to debug at each step of the way, you can use gamla.debug_compose and gamla.debug_compose_left.

gamla.debug_exception

In some cases tracking down an exception involves inspecting code that runs many times. Consider the following example:

def increment(x):
    return x + 1

def sometimes_has_a_bug(x):
    if x == 666:
        raise Exception
    return x

increment_with_bug = gamla.map(gamla.compose_left(increment, sometimes_has_a_bug))

tuple(inrement_with_bug(range(1000)))

Adding a gamla.debug here can be quite tedious, because the code will break many times.

Instead we can use gamla.debug_exception to break only in the case the inner function raises, at which case we would get a breakpoint prompt, and be able to inspect the value causing the exception, use the name x. This would like this:

increment_with_bug = gamla.map(gamla.compose_left(increment, gamla.debug_exception(sometimes_has_a_bug)))

One can also use gamla.debug_exception using a decorator.

@gamla.debug_exception
def sometimes_has_a_bug(x):
    if x == 666:
        raise Exception
    return x

Mixing asynchronous and synchronous code

Most functions in this lib will work seamlessly with async and regular functions, and allow the developer to focus on the logic instead of deciding where to place an await.

For example:

import asyncio

import gamla


def increment(i):
    return i + 1


async def increment_async(i):
    await asyncio.sleep(1)
    return i + 1


async def run():
    mixed_composition = gamla.compose_left(increment, increment_async, increment)
    return await mixed_composition(0)  # returns 3!

Releasing a new version

Increment the version in master, and pypi will automatically update.

Updating documentation after change in README.md

While in gamla directory:

  1. Install md-to-rst converter: pip install m2r
  2. Convert README.md to README.rst: m2r README.md
  3. Move README.rst to docs/source folder instead of existing one: mv README.rst docs/source

Release files for gamla 105

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for gamla 105
File Size Uploaded
gamla-105.tar.gz 43.6 kB Details

Release files / gamla-105.tar.gz

Download URL gamla-105.tar.gz
Size 43.6 kB
Tags Source
SHA-256 checksum
How to use checksums
0e39a51d250930994f941d1781ea4add08506db62f529bb148875f19748074c9
BLAKE2b-256 checksum
How to use checksums
69ed049af728e43b18649ec08437af6ea3fc925eb02a6cac5fb997017d4e5236
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.1

Release history Release notifications | RSS feed

164

1 release file

163

1 release file

162

1 release file

161

1 release file

160

1 release file

159

1 release file

158

1 release file

157

1 release file

156

1 release file

155

1 release file

154

1 release file

153

1 release file

152

1 release file

151

1 release file

150

1 release file

149

1 release file

148

1 release file

147

1 release file

146

1 release file

145

1 release file

144

1 release file

143

1 release file

142

1 release file

141

1 release file

140

1 release file

139

1 release file

138

1 release file

137

1 release file

136

1 release file

135

1 release file

134

1 release file

133

1 release file

132

1 release file

131

1 release file

130

1 release file

129

1 release file

128

1 release file

127

1 release file

126

1 release file

125

1 release file

124

1 release file

123

1 release file

122

1 release file

121

1 release file

120

1 release file

119

1 release file

118

1 release file

117

1 release file

116

1 release file

115

1 release file

114

1 release file

113

1 release file

112

1 release file

111

1 release file

110

1 release file

109

1 release file

108

1 release file

107

1 release file

106

1 release file

This release

105 This release

1 release file

104

1 release file

103

1 release file

102

1 release file

101

1 release file

100

1 release file

99

1 release file

98

1 release file

97

1 release file

96

1 release file

95

1 release file

94

1 release file

93

1 release file

92

1 release file

91

1 release file

90

1 release file

89

1 release file

88

1 release file

87

1 release file

86

1 release file

85

1 release file

84

1 release file

83

1 release file

82

1 release file

81

1 release file

80

1 release file

79

1 release file

78

1 release file

77

1 release file

76

1 release file

75

1 release file

74

1 release file

73

1 release file

72

2 release files

71

1 release file

70

1 release file

69

1 release file

68

2 release files

67

2 release files

66

2 release files

65

1 release file

64

1 release file

63

2 release files

62

2 release files

61

2 release files

60

2 release files

59

1 release file

58

2 release files

57

2 release files

56

2 release files

55

2 release files

54

1 release file

53

1 release file

52

1 release file

51

2 release files

50

2 release files

49

1 release file

48

2 release files

47

2 release files

46

1 release file

45

1 release file

44

2 release files

43

2 release files

42

2 release files

41

2 release files

40

2 release files

39

2 release files

38

2 release files

37

2 release files

36

2 release files

35

2 release files

34

2 release files

33

2 release files

32

2 release files

31

2 release files

30

2 release files

29

2 release files

28

2 release files

27

2 release files

26

2 release files

25

2 release files

24

2 release files

23

2 release files

22

2 release files

21

2 release files

20

2 release files

19

2 release files

18

2 release files

17

2 release files

16

2 release files

15

2 release files

14

2 release files

13

2 release files

12

2 release files

11

2 release files

10

2 release files

9

2 release files

8

2 release files

7

2 release files

6

2 release files

5

2 release files

4

2 release files

3

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

1

2 release files

0.0.78

2 release files

0.0.77

2 release files

0.0.76

2 release files

0.0.75

2 release files

0.0.70

2 release files

0.0.69

2 release files

0.0.68

2 release files

0.0.67

2 release files

0.0.60

2 release files

0.0.59

2 release files

0.0.58

2 release files

0.0.57

2 release files

0.0.56

2 release files

0.0.55

2 release files

0.0.54

2 release files

0.0.53

1 release file

0.0.52

2 release files

0.0.51

2 release files

0.0.50

2 release files

0.0.49

2 release files

0.0.48

2 release files

0.0.47

2 release files

0.0.46

2 release files

0.0.45

2 release files

0.0.44

2 release files

0.0.43

2 release files

0.0.42

2 release files

0.0.39

2 release files

0.0.38

2 release files

0.0.37

2 release files

0.0.36

2 release files

0.0.35

2 release files

0.0.34

2 release files

0.0.33

2 release files

0.0.32

2 release files

0.0.31

2 release files

0.0.30

2 release files

0.0.29

2 release files

0.0.28

2 release files

0.0.27

2 release files

0.0.26

2 release files

0.0.25

2 release files

0.0.24

2 release files

0.0.23

2 release files

0.0.22

2 release files

0.0.21

2 release files

0.0.20

2 release files

0.0.19

2 release files

0.0.10

1 release file

0.0.9

1 release file

0.0.8

1 release file

0.0.7

1 release file

0.0.6

1 release file

0.0.5

1 release file

0.0.4

1 release file

0.0.3

1 release file

0.0.2

1 release file

0.0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page