Browse Source
[FIX] mis_builder: correct implementation and doctests for _min/_max
[FIX] mis_builder: correct implementation and doctests for _min/_max
Conflicts: mis_builder/models/mis_builder.py cherry pick from v8pull/90/head
Stéphane Bidoul
9 years ago
2 changed files with 154 additions and 0 deletions
@ -0,0 +1,149 @@ |
|||||
|
# -*- encoding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# mis_builder module for Odoo, Management Information System Builder |
||||
|
# Copyright (C) 2014-2015 ACSONE SA/NV (<http://acsone.eu>) |
||||
|
# |
||||
|
# This file is a part of mis_builder |
||||
|
# |
||||
|
# mis_builder is free software: you can redistribute it and/or modify |
||||
|
# it under the terms of the GNU Affero General Public License v3 or later |
||||
|
# as published by the Free Software Foundation, either version 3 of the |
||||
|
# License, or (at your option) any later version. |
||||
|
# |
||||
|
# mis_builder is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU Affero General Public License v3 or later for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU Affero General Public License |
||||
|
# v3 or later along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
|
||||
|
|
||||
|
def _sum(l): |
||||
|
""" Same as stdlib sum but returns None instead of 0 |
||||
|
in case of empty sequence. |
||||
|
|
||||
|
>>> sum([1]) |
||||
|
1 |
||||
|
>>> _sum([1]) |
||||
|
1 |
||||
|
>>> sum([1, 2]) |
||||
|
3 |
||||
|
>>> _sum([1, 2]) |
||||
|
3 |
||||
|
>>> sum([]) |
||||
|
0 |
||||
|
>>> _sum([]) |
||||
|
""" |
||||
|
if not l: |
||||
|
return None |
||||
|
return sum(l) |
||||
|
|
||||
|
|
||||
|
def _avg(l): |
||||
|
""" Arithmetic mean of a sequence. Returns None in case of empty sequence. |
||||
|
|
||||
|
>>> _avg([1]) |
||||
|
1.0 |
||||
|
>>> _avg([1, 2]) |
||||
|
1.5 |
||||
|
>>> _avg([]) |
||||
|
""" |
||||
|
if not l: |
||||
|
return None |
||||
|
return sum(l) / float(len(l)) |
||||
|
|
||||
|
|
||||
|
def _min(*args): |
||||
|
""" Same as stdlib min but returns None instead of exception |
||||
|
in case of empty sequence. |
||||
|
|
||||
|
>>> min(1, 2) |
||||
|
1 |
||||
|
>>> _min(1, 2) |
||||
|
1 |
||||
|
>>> min([1, 2]) |
||||
|
1 |
||||
|
>>> _min([1, 2]) |
||||
|
1 |
||||
|
>>> min(1) |
||||
|
Traceback (most recent call last): |
||||
|
File "<stdin>", line 1, in ? |
||||
|
TypeError: 'int' object is not iterable |
||||
|
>>> _min(1) |
||||
|
Traceback (most recent call last): |
||||
|
File "<stdin>", line 1, in ? |
||||
|
TypeError: 'int' object is not iterable |
||||
|
>>> min([1]) |
||||
|
1 |
||||
|
>>> _min([1]) |
||||
|
1 |
||||
|
>>> min() |
||||
|
Traceback (most recent call last): |
||||
|
File "<stdin>", line 1, in ? |
||||
|
TypeError: min expected 1 arguments, got 0 |
||||
|
>>> _min() |
||||
|
Traceback (most recent call last): |
||||
|
File "<stdin>", line 1, in ? |
||||
|
TypeError: min expected 1 arguments, got 0 |
||||
|
>>> min([]) |
||||
|
Traceback (most recent call last): |
||||
|
File "<stdin>", line 1, in ? |
||||
|
ValueError: min() arg is an empty sequence |
||||
|
>>> _min([]) |
||||
|
""" |
||||
|
if len(args) == 1 and not args[0]: |
||||
|
return None |
||||
|
return min(*args) |
||||
|
|
||||
|
|
||||
|
def _max(*args): |
||||
|
""" Same as stdlib max but returns None instead of exception |
||||
|
in case of empty sequence. |
||||
|
|
||||
|
>>> max(1, 2) |
||||
|
2 |
||||
|
>>> _max(1, 2) |
||||
|
2 |
||||
|
>>> max([1, 2]) |
||||
|
2 |
||||
|
>>> _max([1, 2]) |
||||
|
2 |
||||
|
>>> max(1) |
||||
|
Traceback (most recent call last): |
||||
|
File "<stdin>", line 1, in ? |
||||
|
TypeError: 'int' object is not iterable |
||||
|
>>> _max(1) |
||||
|
Traceback (most recent call last): |
||||
|
File "<stdin>", line 1, in ? |
||||
|
TypeError: 'int' object is not iterable |
||||
|
>>> max([1]) |
||||
|
1 |
||||
|
>>> _max([1]) |
||||
|
1 |
||||
|
>>> max() |
||||
|
Traceback (most recent call last): |
||||
|
File "<stdin>", line 1, in ? |
||||
|
TypeError: max expected 1 arguments, got 0 |
||||
|
>>> _max() |
||||
|
Traceback (most recent call last): |
||||
|
File "<stdin>", line 1, in ? |
||||
|
TypeError: max expected 1 arguments, got 0 |
||||
|
>>> max([]) |
||||
|
Traceback (most recent call last): |
||||
|
File "<stdin>", line 1, in ? |
||||
|
ValueError: max() arg is an empty sequence |
||||
|
>>> _max([]) |
||||
|
""" |
||||
|
if len(args) == 1 and not args[0]: |
||||
|
return None |
||||
|
return max(*args) |
||||
|
|
||||
|
|
||||
|
if __name__ == "__main__": |
||||
|
import doctest |
||||
|
doctest.testmod() |
Write
Preview
Loading…
Cancel
Save
Reference in new issue