Source code for afivmax.afivmax

"""max的一个implementation
"""


[docs]def afiv_max(*args, key=None, **kwargs): """取出最大值 max(iterable, \*[, default=obj, key=func]) -> value\n max(arg1, arg2, \*args, \*[, key=func]) -> value Note: 使用``kwargs``是因为原生的max在执行``max(1, 2, default=10)``会raise一个TypeError, 使用``default=None``比较难完成这一个Feature. Args: args: iterable or arg1,arg2,... 取最大值的source key: func, optional 从args取出比较对象的函数 default: None or DEFAULT_VALUE 1. 如果args的第一个元素为iterable且为空时返回的值\n 2. 如果是arg1,arg2,的形式会raise一个TypeError Returns: max_item: 就是返回最大值 Raises: TypeError: 1. 当args为空的时候\n 2. 有除了default和key以外参数的时候\n 3. 当arg1,arg2,...的时候有default参数的时候\n 4. key返回的值不支持'>'的时候\n 5. args为iterable且为空且default没有提供的时候 """ n_args = len(args) if n_args == 0: raise TypeError("No arguments provided!") n_kwargs = len(kwargs) if n_args > 1: # args is always iterable since itself is a list it = iter(args) if "default" in kwargs: raise TypeError("Cannot specify a default for afiv_max() with multiple positional arguments") if n_kwargs > 0: raise TypeError("TypeError: function takes at most 2 arguments ({} given)".format(n_kwargs)) else: try: it = iter(args[0]) except TypeError: raise TypeError("'{}' object is not iterable".format(type(args[0]).__name__)) if n_kwargs > 1: raise TypeError("TypeError: function takes at most 2 arguments ({} given)".format(n_kwargs)) if n_kwargs == 1: if "default" not in kwargs: raise TypeError( "TypeError: '{}' is an invalid keyword argument for this function".format(list(kwargs.keys())[0])) max_item, max_val = None, None # one-pass for item in it: if key is not None: # if key is not None # we use what key func return as the value val = key(item) if val is None: raise TypeError("key func should return something!") else: val = item if max_val is None: max_item = item max_val = val else: try: is_new_king = val > max_val except TypeError: raise TypeError("'>' not supported between instances of '{}' and '{}'".format( type(val).__name__, type(max_val).__name__)) if is_new_king: max_item = item max_val = val if max_val is None: if "default" in kwargs: max_item = kwargs["default"] else: raise TypeError("Find the max value from an iterable which is empty!") return max_item