Last active
December 10, 2018 13:06
-
-
Save dpineiden/c0639537bb0d35aaf37fa92f3237722b to your computer and use it in GitHub Desktop.
Choice an option from dict
This file contains 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
def choice_input(choices_dict, | |
type_opt_lambda=lambda x: True, | |
xprint=print): | |
commands = choices_dict | |
reverse_commands = {give_name(value): key | |
for key, value in commands.items()} | |
options = ["%s -> %s" % (key, give_name(value)) | |
for key, value in commands.items()] | |
key = "" | |
msg_type = type_opt_lambda(None) | |
option_nr = 0 | |
while key not in commands: | |
[xprint(option) for option in options] | |
option = input("Choose an option: \n") | |
command, key, option_nr = get_command( | |
commands, | |
reverse_commands, | |
option) | |
msg_type = type_opt_lambda(option_nr) | |
return command, option, msg_type | |
def get_command(commands, reverse_commands, option): | |
option_nr = 0 | |
if option.isdigit(): | |
option = int(option) | |
if option in commands: | |
command = commands.get(option) | |
option_nr = option | |
else: | |
command = 'PRINT' | |
option_nr = option | |
else: | |
# command is the value | |
result_k, key, command = multikey(commands, option) | |
result_v = False | |
if result_k: | |
option = key | |
else: | |
# command is the key | |
result_v, key = multivalue(reverse_commands, option) | |
command = commands.get(key) | |
if result_v: | |
option = key | |
if result_k or result_v: | |
option_nr = reverse_commands.get(command) | |
return command, option, option_nr | |
def multikey(commands, key): | |
""" | |
Given an string key, look for the value in commands, if key | |
has upper or lower case, consider that. | |
""" | |
result = False | |
final_key = key | |
command = None | |
if key in commands: | |
command = commands.get(key) | |
result = True | |
elif key.lower() in commands: | |
final_key = key.lower() | |
command = commands.get(final_key) | |
result = True | |
elif key.upper() in commands: | |
final_key = key.upper() | |
command = commands.get(final_key) | |
result = True | |
# here command is the value of the key | |
return result, final_key, command | |
def multivalue(reverse_commands, value): | |
""" | |
Given an string value, look for the key in commands, if value | |
has upper or lower case, consider that. | |
""" | |
result = False | |
final_value = value | |
key = None | |
if value in reverse_commands: | |
key = reverse_commands.get(value) | |
result = True | |
elif value.lower() in reverse_commands: | |
final_value = value.lower() | |
key = reverse_commands.get(final_value) | |
result = True | |
elif value.upper() in reverse_commands: | |
final_value = value.upper() | |
key = reverse_commands.get(final_value) | |
result = True | |
# here command is the key | |
return result, key | |
def give_name(value): | |
if callable(value): | |
return value.__name__ | |
else: | |
return str(value) | |
from networktools.library import choice_input | |
if __name__ == "__main__": | |
commands = {0: "PRINT", | |
1: "AUTH_MSG", | |
2: "ADD_SOCK", | |
3: "ACTIVE_SOCK", | |
4: 'CONNECT_SOCK', | |
5: "SEND_MSG"} | |
opt = lambda x: 'LOW' if x in [0,1,2] else 'HIGH' | |
command, key, msg_type = choice_input(commands, type_opt_lambda=opt) | |
print("====="*5) | |
print(command, key, msg_type) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment