cimport cython
import sys
IS_PY3 = sys.version_info[0] >= 3
ustring = u'abcdef'
sstring = 'abcdef'
bstring = b'abcdef'
def isinstance_basestring(obj):
"""
>>> isinstance_basestring(ustring)
True
>>> isinstance_basestring(sstring)
True
>>> if IS_PY3: print(not isinstance_basestring(bstring))
... else: print(isinstance_basestring(bstring))
True
"""
return isinstance(obj, basestring)
def basestring_is_unicode_in_py3():
"""
>>> basestring_is_unicode_in_py3()
True
"""
if IS_PY3:
return basestring is unicode
else:
return basestring is not unicode
def unicode_subtypes_basestring():
"""
>>> unicode_subtypes_basestring()
True
"""
return issubclass(unicode, basestring)
def basestring_typed_variable(obj):
"""
>>> basestring_typed_variable(None) is None
True
>>> basestring_typed_variable(ustring) is ustring
True
>>> basestring_typed_variable(sstring) is sstring
True
>>> if IS_PY3: print(True)
... else: print(basestring_typed_variable(bstring) is bstring)
True
>>> class S(str): pass
>>> basestring_typed_variable(S()) # doctest: +ELLIPSIS
Traceback (most recent call last):
TypeError: ...got S...
"""
cdef basestring s
s = u'abc'
assert s
s = 'abc'
assert s
# make sure coercion also works in conditional expressions
s = u'abc' if obj else 'abc'
assert s
s = obj
return s
def basestring_typed_argument(basestring obj):
"""
>>> basestring_typed_argument(None) is None
True
>>> basestring_typed_argument(ustring) is ustring
True
>>> basestring_typed_argument(sstring) is sstring
True
>>> if IS_PY3: print(True)
... else: print(basestring_typed_argument(bstring) is bstring)
True
>>> class S(str): pass
>>> basestring_typed_argument(S()) # doctest: +ELLIPSIS
Traceback (most recent call last):
TypeError: ...got S...
"""
return obj
@cython.test_assert_path_exists(
"//SimpleCallNode",
"//SimpleCallNode//NoneCheckNode",
"//SimpleCallNode//AttributeNode[@is_py_attr = false]")
def basestring_join(basestring s, *values):
"""
>>> print(basestring_join(ustring, 'a', 'b', 'c'))
aabcdefbabcdefc
>>> print(basestring_join(sstring, 'a', 'b', 'c'))
aabcdefbabcdefc
>>> if IS_PY3: print('abcdefabcdefabcdef')
... else: print(basestring_join(bstring, bstring, bstring).decode('utf8'))
abcdefabcdefabcdef
>>> basestring_join(None, 'a', 'b', 'c')
Traceback (most recent call last):
AttributeError: 'NoneType' object has no attribute 'join'
"""
return s.join(values)