
On Mon, Apr 6, 2020 at 9:49 AM Chris Angelico <rosuav@gmail.com> wrote:
This all made me think *why* do I type check strings, and virtually nothing else? And it's because in most otehr places, if I want a given type, I can just try to make it from the input:
x = float(x) i = int(i)
arr = np.asarray(np)
but:
st = str(st)
doesn't work because ANY object can be made into a string.
Not sure I understand your point here. Calling float() or int() will give you a float or int for many values that aren't floats or ints, just as calling str() will give you a string. The only real difference (as far as I can tell) is that, as you say, any object can be stringified. But all of those operations are potentially lossy - int(1.5) and float(1e100000) both throw away information - and they don't prove that something already was a string/int/float, just that it _now_ is.
yes, but the operation will only work if the value CAN be turned into a float or int (or numpy array, for asarray), and you will get a ValueError for most arbitrary objects. It doesn't have to be lossless to be useful -- you are most often going to lose SOMETHING when you do a type cast. This was particularly useful in Py2 without future division: def fun(x): x = float(x) .... meant that you were assured that x was indeed a float now, and whatever type it was before, it was a type (and value) that could be cast to a float. even it were lossy, And now, I still use that when receiving a string (Or something :-) ) that should be convertible to a float, if someone passes in some other type, or a string that can't be interpreted as a float, I get a TypeError or ValueError. But with str(), virtually any type (absolutely any?) will lead to a valid string object, regardless of its type or value. In practice, the only example I can think of is maybe Path objects, which you may want to accept in place of a str, in a function that really does need a str. but we have the __fspath__protocol now, so that's been obsoleted. and as pointed out in this thread, there is a lot of code that requires an actual str object, not just something that is duck typed like one. This is a lot like numpy, and why asarray is used a lot. but no, asstring() would not be useful -- but mostly because there are essentially no other types out there that are "string-like objects". -CHB -- Christopher Barker, PhD Python Language Consulting - Teaching - Scientific Software Development - Desktop GUI and Web Development - wxPython, numpy, scipy, Cython