-有两个数据源包含关于猫和狗的信息(cat_data和dog_data-都是在该函数外部的main中定义的全局变量。
-目标是从";cat_ data";并存储到";cat_list";或";dog_ data";存储到";dog_list";或者最后创建两个列表并用正确的数据填充。然后,需要调用这些列表并以一种可以在该本地化函数之外使用的方式存储这些列表。
-我的函数的单个参数是:;my_selection"-并且可以是";cat"狗;或";两个";并将确定我是否需要创建cat_list、dog_list或两个列表,然后用正确的数据填充每个列表。
-假设填充列表的数据是正确的,并且在每个if循环中正确创建和填充了每个列表。(是的,我知道我必须首先将其定义为一个空列表,然后通过迭代数据进行附加——这部分工作得很好,我想简化它以便于阅读
-这是我的代码:
def create_lists (my_selection):
if (my_selection == "cat" or my_selection == "both"):
cat_list_local = cat_data # "cat_list_local" is just my localized cat_list variable
if (my_selection == "cat"):
return(cat_list_local) #if "cat" is selected, they only want a cat_list
if (my_selection == "dog" or my_selection == "both"):
dog_list_local = dog_data #"dog_list_local" is just my localized dog_list variable
if(my_selection == "dog"):
return(dog_list_local) #if "dog" is selected, they only want a dog_list
else:
return( cat_list_local, dog_list_local) # if "both" was selected, we have now created and filled both lists and need to return both lists out of the function
# These are my Function calls below and the part where I am struggling:
# This is the best I can think of....where I will have to just run the one statement (line) based on what list(s) I want
dog_list = create_lists("dog")
cat_list = create_lists("cat")
cat_list, dog_list = create_lists("both")
然而,我不想有这三个单独的函数调用不知怎么的,只有一个。我正沿着第二个函数的思路思考接收您的选择参数(cat、dog或两者(,然后从三个函数调用中正确选择调用";create_lists((并提取数据。
我设想了一个程序(或函数(类型的解决方案,我可以简单地在控制台中使用所需的选择参数来创建和填充我的列表。我的一个解决方案(虽然非常丑陋(是创建一个选择变量并将其硬设置为"0";cat"狗;或";两个";然后根据选择变量在三个函数调用中的每一个调用周围放置if语句。因此,每当我需要更新数据或更改列表时,我都会更改选择变量的值,然后突出显示所有if语句和函数调用,这样它就可以执行正确的函数调用。
然而,必须有一种更清洁的方法来做到这一点。一个理想的解决方案是运行一些东西,比如程序或函数,或者我真的不知道在控制台中用所选参数做什么的东西,随后的语句会像函数((一样启动。我知道我可以将列表定义为全局列表,但我想看看是否有其他方法。
请在这里建议正确和健康的编码礼仪。
这是一个巧妙的问题,因为它暴露了许多可以添加的生活质量细节。
首先,你有这样的代码块:
if choice == 'dog' or choice == 'both':
# do dog stuff
if choice == 'cat' or choice == 'both':
# do cat stuff
我认为这是穷人的列举。请考虑此处的Flag
枚举。
from enum import Flag, auto
class Dataset(Flag):
CAT = auto()
DOG = auto()
BOTH = CAT | DOG
# the above is sufficient, but consider writing a constructor as well!
@classmethod
def from_str(cls, s):
return cls[s.upper()]
现在,您可以接受用户输入并将其用作:
choice = input("Which dataset? ") # cat, dog, or both
dataset = Dataset.from_str(choice)
"亚当;我听到你哭了,";这给了我什么功能"为什么,它当然可以让你做会员测试!
if Dataset.CAT in dataset:
# do cat things
if Dataset.DOG in dataset:
# do dog things
把所有这些都封装在一个函数中,你最终会得到这样的东西:
from enum import Flag, auto
from typing import Mapping
class Dataset(Flag):
CAT = auto()
DOG = auto()
BOTH = CAT | DOG
@classmethod
def from_str(cls, s):
return cls[s.upper()]
# the type hinting I use here assumes that the return value is a
# dict of lists of strings, but if that's incorrect, you can either
# correct it or omit the type hinting completely.
def make_lists(dataset: Dataset) -> Dict[List[str]]:
"""Based on a dataset, create a mapping of output"""
output = {}
if Dataset.DOG in dataset:
output['dog'] = dog_data
if Dataset.CAT in dataset:
output['cat'] = cat_data
return output
if __name__ == '__main__':
from pprint import pprint # to pretty print the output
# Get user input
while True:
choice = input("Which dataset? ")
try:
dataset = Dataset.from_str(choice)
except KeyError:
print(f"No dataset found named '{choice}'. Valid choices are {', '.join(Dataset.__members__.keys())}")
else:
break
pprint(make_lists(dataset))
现在有趣的是,除了导入和枚举定义,这是可怕的一行:
pprint({k: vars().get(f"{k}_data") for choice in [input('Which dataset? ')] for k in ['cat', 'dog'] if Dataset.from_str(k) in Dataset.from_str(choice)})