处理功能的多余或重复参数?

时间:2018-10-08 23:37:14

标签: python

对于在传递给函数的参数可能是重复的/多余的情况下的处理方法,我有一个好的问题。假设我有一个简单的函数来评估是否有任何用户超过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? 还是完全其他?

任何帮助,不胜感激!

0 个答案:

没有答案