__init__.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. >>> p1.merge(p2)
  78. >>> str(p1)
  79. 'Max Mustermann (*1976-02-01)'
  80. >>> p1.mother, p1.father
  81. (Person(mother), Person(father))
  82. """
  83. if person.name is not None:
  84. self.name = person.name
  85. if person.birth_date is not None:
  86. self.birth_date = person.birth_date
  87. if person.mother is not None:
  88. self.mother = person.mother
  89. if person.father is not None:
  90. self.father = person.father