Created
February 4, 2021 13:06
-
-
Save gidgid/8a4f04d1cf03ec4af8c4450d7a04fde6 to your computer and use it in GitHub Desktop.
shows how to use product from itertools to avoid nested loops
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from typing import Set | |
from dataclasses import dataclass | |
from itertools import product | |
@dataclass(frozen=True, eq=True) | |
class UserOption: # 1 | |
nickname: str | |
hobby: str | |
email: str | |
def to_user_options(raw_user: dict) -> Set[UserOption]: | |
return { | |
UserOption(nickname=nickname, hobby=hobby, email=email) | |
for nickname, hobby, email in product( # 2 | |
raw_user["nicknames"], raw_user["hobbies"], raw_user["emails"] | |
) | |
} | |
def test_converts_to_all_options(): | |
user_input = { | |
"name": "Alice", | |
"nicknames": ["alice", "alison"], | |
"emails": ["[email protected]", "[email protected]"], | |
"hobbies": ["climbing", "running", "acrobatics"], | |
} # 3 | |
actual_options = to_user_options(user_input) | |
expected_options = { | |
UserOption(nickname="alice", email="[email protected]", hobby="climbing"), | |
UserOption(nickname="alice", email="[email protected]", hobby="running"), | |
UserOption(nickname="alice", email="[email protected]", hobby="acrobatics"), | |
UserOption(nickname="alice", email="[email protected]", hobby="climbing"), | |
UserOption(nickname="alice", email="[email protected]", hobby="running"), | |
UserOption(nickname="alice", email="[email protected]", hobby="acrobatics"), | |
UserOption(nickname="alison", email="[email protected]", hobby="climbing"), | |
UserOption(nickname="alison", email="[email protected]", hobby="running"), | |
UserOption(nickname="alison", email="[email protected]", hobby="acrobatics"), | |
UserOption(nickname="alison", email="[email protected]", hobby="climbing"), | |
UserOption(nickname="alison", email="[email protected]", hobby="running"), | |
UserOption(nickname="alison", email="[email protected]", hobby="acrobatics"), | |
} | |
assert actual_options == expected_options # 4 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment