Source code for python_utils.converters

from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

import re
import six


[docs]def to_int(input_, default=0, exception=(ValueError, TypeError), regexp=None): ''' Convert the given input to an integer or return default When trying to convert the exceptions given in the exception parameter are automatically catched and the default will be returned. The regexp parameter allows for a regular expression to find the digits in a string. When True it will automatically match any digit in the string. When a (regexp) object (has a search method) is given, that will be used. WHen a string is given, re.compile will be run over it first The last group of the regexp will be used as value >>> to_int('abc') 0 >>> to_int('1') 1 >>> to_int('abc123') 0 >>> to_int('123abc') 0 >>> to_int('abc123', regexp=True) 123 >>> to_int('123abc', regexp=True) 123 >>> to_int('abc123abc', regexp=True) 123 >>> to_int('abc123abc456', regexp=True) 123 >>> to_int('abc123', regexp=re.compile('(\d+)')) 123 >>> to_int('123abc', regexp=re.compile('(\d+)')) 123 >>> to_int('abc123abc', regexp=re.compile('(\d+)')) 123 >>> to_int('abc123abc456', regexp=re.compile('(\d+)')) 123 >>> to_int('abc123', regexp='(\d+)') 123 >>> to_int('123abc', regexp='(\d+)') 123 >>> to_int('abc', regexp='(\d+)') 0 >>> to_int('abc123abc', regexp='(\d+)') 123 >>> to_int('abc123abc456', regexp='(\d+)') 123 >>> to_int('1234', default=1) 1234 >>> to_int('abc', default=1) 1 >>> to_int('abc', regexp=123) Traceback (most recent call last): ... TypeError: unknown argument for regexp parameter: 123 ''' if regexp is True: regexp = re.compile('(\d+)') elif isinstance(regexp, six.string_types): regexp = re.compile(regexp) elif hasattr(regexp, 'search'): pass elif regexp is not None: raise TypeError('unknown argument for regexp parameter: %r' % regexp) try: if regexp: match = regexp.search(input_) if match: input_ = match.groups()[-1] return int(input_) except exception: return default
[docs]def to_float(input_, default=0, exception=(ValueError, TypeError), regexp=None): ''' Convert the given `input_` to an integer or return default When trying to convert the exceptions given in the exception parameter are automatically catched and the default will be returned. The regexp parameter allows for a regular expression to find the digits in a string. When True it will automatically match any digit in the string. When a (regexp) object (has a search method) is given, that will be used. WHen a string is given, re.compile will be run over it first The last group of the regexp will be used as value >>> '%.2f' % to_float('abc') '0.00' >>> '%.2f' % to_float('1') '1.00' >>> '%.2f' % to_float('abc123.456', regexp=True) '123.46' >>> '%.2f' % to_float('abc123', regexp=True) '123.00' >>> '%.2f' % to_float('abc0.456', regexp=True) '0.46' >>> '%.2f' % to_float('abc123.456', regexp=re.compile('(\d+\.\d+)')) '123.46' >>> '%.2f' % to_float('123.456abc', regexp=re.compile('(\d+\.\d+)')) '123.46' >>> '%.2f' % to_float('abc123.46abc', regexp=re.compile('(\d+\.\d+)')) '123.46' >>> '%.2f' % to_float('abc123abc456', regexp=re.compile('(\d+(\.\d+|))')) '123.00' >>> '%.2f' % to_float('abc', regexp='(\d+)') '0.00' >>> '%.2f' % to_float('abc123', regexp='(\d+)') '123.00' >>> '%.2f' % to_float('123abc', regexp='(\d+)') '123.00' >>> '%.2f' % to_float('abc123abc', regexp='(\d+)') '123.00' >>> '%.2f' % to_float('abc123abc456', regexp='(\d+)') '123.00' >>> '%.2f' % to_float('1234', default=1) '1234.00' >>> '%.2f' % to_float('abc', default=1) '1.00' >>> '%.2f' % to_float('abc', regexp=123) Traceback (most recent call last): ... TypeError: unknown argument for regexp parameter ''' if regexp is True: regexp = re.compile('(\d+(\.\d+|))') elif isinstance(regexp, six.string_types): regexp = re.compile(regexp) elif hasattr(regexp, 'search'): pass elif regexp is not None: raise TypeError('unknown argument for regexp parameter') try: if regexp: match = regexp.search(input_) if match: input_ = match.group(1) return float(input_) except exception: return default
[docs]def to_unicode(input_, encoding='utf-8', errors='replace'): '''Convert objects to unicode, if needed decodes string with the given encoding and errors settings. :rtype: unicode >>> to_unicode(b'a') 'a' >>> to_unicode('a') 'a' >>> to_unicode(u'a') 'a' >>> class Foo(object): __str__ = lambda s: u'a' >>> to_unicode(Foo()) 'a' >>> to_unicode(Foo) "<class 'python_utils.converters.Foo'>" ''' if hasattr(input_, 'decode'): input_ = input_.decode(encoding, errors) else: input_ = six.text_type(input_) return input_
[docs]def to_str(input_, encoding='utf-8', errors='replace'): '''Convert objects to string, encodes to the given encoding :rtype: str >>> to_str('a') b'a' >>> to_str(u'a') b'a' >>> to_str(b'a') b'a' >>> class Foo(object): __str__ = lambda s: u'a' >>> to_str(Foo()) 'a' >>> to_str(Foo) "<class 'python_utils.converters.Foo'>" ''' if isinstance(input_, six.binary_type): pass else: if not hasattr(input_, 'encode'): input_ = six.text_type(input_) input_ = input_.encode(encoding, errors) return input_