1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

from datetime import timedelta 

 

 

class _TzSingleton(type): 

def __init__(cls, *args, **kwargs): 

cls.__instance = None 

super(_TzSingleton, cls).__init__(*args, **kwargs) 

 

def __call__(cls): 

if cls.__instance is None: 

cls.__instance = super(_TzSingleton, cls).__call__() 

return cls.__instance 

 

class _TzFactory(type): 

def instance(cls, *args, **kwargs): 

"""Alternate constructor that returns a fresh instance""" 

return type.__call__(cls, *args, **kwargs) 

 

 

class _TzOffsetFactory(_TzFactory): 

def __init__(cls, *args, **kwargs): 

cls.__instances = {} 

 

def __call__(cls, name, offset): 

if isinstance(offset, timedelta): 

key = (name, offset.total_seconds()) 

else: 

key = (name, offset) 

 

instance = cls.__instances.get(key, None) 

if instance is None: 

instance = cls.__instances.setdefault(key, 

cls.instance(name, offset)) 

return instance 

 

 

class _TzStrFactory(_TzFactory): 

def __init__(cls, *args, **kwargs): 

cls.__instances = {} 

 

def __call__(cls, s, posix_offset=False): 

key = (s, posix_offset) 

instance = cls.__instances.get(key, None) 

 

if instance is None: 

instance = cls.__instances.setdefault(key, 

cls.instance(s, posix_offset)) 

return instance