Source code for robot.utils.frange

#  Copyright 2008-2015 Nokia Networks
#  Copyright 2016-     Robot Framework Foundation
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

from .robottypes import is_integer, is_string


[docs]def frange(*args): """Like ``range()`` but accepts float arguments.""" if all(is_integer(arg) for arg in args): return list(range(*args)) start, stop, step = _get_start_stop_step(args) digits = max(_digits(start), _digits(stop), _digits(step)) factor = pow(10, digits) return [x / factor for x in range(round(start*factor), round(stop*factor), round(step*factor))]
def _get_start_stop_step(args): if len(args) == 1: return 0, args[0], 1 if len(args) == 2: return args[0], args[1], 1 if len(args) == 3: return args raise TypeError('frange expected 1-3 arguments, got %d.' % len(args)) def _digits(number): if not is_string(number): number = repr(number) if 'e' in number: return _digits_with_exponent(number) if '.' in number: return _digits_with_fractional(number) return 0 def _digits_with_exponent(number): mantissa, exponent = number.split('e') mantissa_digits = _digits(mantissa) exponent_digits = int(exponent) * -1 return max(mantissa_digits + exponent_digits, 0) def _digits_with_fractional(number): fractional = number.split('.')[1] if fractional == '0': return 0 return len(fractional)