import datetime import json from dataclasses import dataclass @dataclass class User: username: str last_login: datetime.datetime def generate_latest_login_report(users, output_format): if output_format == "JSON": return json.dumps( [ {"username": user.username, "last_login": user.last_login.isoformat()} for user in users ] ) elif output_format == "CSV": return "\n".join( f"{user.username}, {user.last_login.isoformat()}" for user in users ) else: return ";".join( f"{user.username} {user.last_login.isoformat()}" for user in users ) # with strategy def generate_latest_login_report_json(users): return json.dumps( [ {"username": user.username, "last_login": user.last_login.isoformat()} for user in users ] ) def generate_latest_login_report_csv(users): return "\n".join( f"{user.username}, {user.last_login.isoformat()}" for user in users ) def generate_latest_login_report_default_text(users): return ";".join(f"{user.username} {user.last_login.isoformat()}" for user in users) report_generators = { "JSON": generate_latest_login_report_json, "CSV": generate_latest_login_report_csv, } def generate_latest_login_report(users, outputFormat): report_generator = report_generators.get( outputFormat, generate_latest_login_report_default_text ) return report_generator(users) users = [ User(username="johndoe", last_login=datetime.datetime(2021, 8, 7)), User(username="janedoe", last_login=datetime.datetime(2021, 4, 3)), ] print(generate_latest_login_report(users, "JSON")) # multi-parameter selection @dataclass class User: name: str country: str role: str def us_admin(name): return f"Hello, Admin {name}" def us_user(name): return f"Hello, {name}" def it_admin(name): return f"Buongiorno, Admin {name}" def default(name): return f"Hi, {name}" greetings = { ("US", "Admin"): us_admin, ("US", "User"): us_user, ("IT", "Admin"): it_admin, } def say_greeting(user): greeting = greetings.get((user.country, user.role), default) return greeting(user.name) print(say_greeting(User(name="John", country="IT", role="Admin")))