__init__.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import datetime
  2. import typing
  3. class Person:
  4. def __init__(self, identifier: str):
  5. self.identifier: str = identifier
  6. self.name: typing.Optional[str] = None
  7. self.birth_date: typing.Optional[datetime.date] = None
  8. self.mother: typing.Optional["Person"] = None
  9. self.father: typing.Optional["Person"] = None
  10. def __repr__(self) -> str:
  11. """
  12. >>> p = Person("max-mustermann")
  13. >>> repr(p)
  14. 'Person(max-mustermann)'
  15. >>> p.name = "Hr. Mustermann"
  16. >>> repr(p)
  17. 'Person(max-mustermann, Hr. Mustermann)'
  18. >>> p.name = "Max Mustermann"
  19. >>> repr(p)
  20. 'Person(max-mustermann, Max Mustermann)'
  21. >>> p.birth_date = datetime.date(1976, 2, 1)
  22. >>> repr(p)
  23. 'Person(max-mustermann, Max Mustermann, *1976-02-01)'
  24. """
  25. return "{}({})".format(
  26. type(self).__name__,
  27. ", ".join(
  28. filter(
  29. None,
  30. (
  31. self.identifier,
  32. self.name,
  33. "*" + self.birth_date.isoformat()
  34. if self.birth_date is not None
  35. else None,
  36. ),
  37. )
  38. ),
  39. )
  40. def __str__(self) -> str:
  41. """
  42. >>> p = Person("max-mustermann")
  43. >>> p.name = "Max Mustermann"
  44. >>> str(p)
  45. 'Max Mustermann'
  46. >>> p.birth_date = datetime.date(1976, 2, 1)
  47. >>> str(p)
  48. 'Max Mustermann (*1976-02-01)'
  49. """
  50. return (self.name or "unnamed") + (
  51. " (*{})".format(self.birth_date.isoformat()) if self.birth_date else ""
  52. )
  53. def __eq__(self, other: "Person") -> bool:
  54. """
  55. >>> maxl = Person("max")
  56. >>> maxl.name = "Max Mustermann"
  57. >>> maxl == Person("max")
  58. True
  59. >>> erika = Person("erika")
  60. >>> erika.name = "Max Mustermann"
  61. >>> maxl == erika
  62. False
  63. """
  64. return self.identifier == other.identifier
  65. def merge(self, person: "Person") -> None:
  66. """
  67. >>> p1 = Person("max")
  68. >>> p1.name = "Max Mustermann"
  69. >>> str(p1)
  70. 'Max Mustermann'
  71. >>> p2 = Person("max2")
  72. >>> p2.birth_date = datetime.date(1976, 2, 1)
  73. >>> p2.mother = Person("mother")
  74. >>> p2.father = Person("father")
  75. >>> str(p2)
  76. 'unnamed (*1976-02-01)'
  77. add attributes of p2 to p1:
  78. >>> p1.merge(p2)
  79. >>> str(p1)
  80. 'Max Mustermann (*1976-02-01)'
  81. >>> p1.mother, p1.father
  82. (Person(mother), Person(father))
  83. p2 is unchanged:
  84. >>> str(p2)
  85. 'unnamed (*1976-02-01)'
  86. """
  87. for attr in ["name", "birth_date", "mother", "father"]:
  88. if getattr(person, attr) is not None:
  89. setattr(self, attr, getattr(person, attr))
  90. class PersonCollection:
  91. def __init__(self):
  92. self._persons = {}
  93. def __getitem__(self, identifier: str) -> Person:
  94. """
  95. >>> c = PersonCollection()
  96. >>> c.add_person(Person("alice"))
  97. Person(alice)
  98. >>> c["alice"]
  99. Person(alice)
  100. """
  101. return self._persons[identifier]
  102. def add_person(self, person: Person) -> Person:
  103. """
  104. >>> c = PersonCollection()
  105. >>> c.add_person(Person("alice"))
  106. Person(alice)
  107. >>> c.add_person(Person("bob"))
  108. Person(bob)
  109. >>> c["bob"]
  110. Person(bob)
  111. >>> bob = Person("bob")
  112. >>> bob.birth_date = datetime.date(2010, 2, 3)
  113. >>> c.add_person(bob)
  114. Person(bob, *2010-02-03)
  115. """
  116. if person.identifier not in self._persons:
  117. self._persons[person.identifier] = person
  118. return person
  119. existing_person = self._persons[person.identifier]
  120. existing_person.merge(person)
  121. return existing_person