对于在传递给函数的参数可能是重复的/多余的情况下的处理方法,我有一个好的问题。假设我有一个简单的函数来评估是否有任何用户超过0.5;并且此函数可以使用pd.Series或类似数组的输入:
import pandas as pd
def validate_user_holdings(user_holdings, **kwargs):
user_names = kwargs.get('user_names', None)
if isinstance(user_holdings, pd.Series):
errors = ['{} over limit'.format(user_name)
for user_name in user_holdings.index
if user_holdings[user_name] > 0.5]
else:
errors = ['{} over limit'.format(user_name)
for i, user_name in enumerate(user_names)
if user_holdings[i] > 0.5]
return errors
如果我们随后创建一些虚拟数据并将其作为一对列表传递,那么一切都很好-我们将此称为方案A:
user_holdings = [0.2, 0.4, 0.3, 0.6]
user_names = ['User A','User B','User C','User D']
# Using a list for user_holdings and a separate list to supply user_names
validate_user_holdings(user_holdings, user_names = user_names)
给我正确的结果:
['User D over limit']
(方案B)如果我从这两个列表中创建一个序列并将其传递给我,则会得到相同的结果:
user_holdings_series = pd.Series(index=user_names, data=user_holdings)
# Putting both lists into a series and passing that
validate_user_holdings(user_holdings_series)
在接下来的两种情况下,我们开始进入道德迷宫:
(场景C)如果我通过系列又通过了user_names,则不使用user_names,但也不会与该系列冲突,因此不会造成真正的伤害:
validate_user_holdings(user_holdings_series, user_names = user_names)
开始令人讨厌的是,如果用户通过user_names参数传递冲突列表,同时还传递pd.Series:
user_names = ['User D','User C','User B','User A']
validate_user_holdings(user_holdings_series, user_names = user_names)
此处的错误与其他情况相同:
['User D over limit']
但是显然,现在存在着使用户对实际上超重的用户感到困惑的风险。
是否存在公认的Python良好实践来应对这些情况?我应该说
i)是否警告用户输入是否多余,但不冲突?
ii)如果有多余的用户输入并且确实发生冲突(因此在这种情况下user_names列表与pd.Series.index不同),是否出错?
iii)允许显式传递的用户输入(方案D中的user_names列表)覆盖pd.Series.index? 还是完全其他?
任何帮助,不胜感激!