Problems using struct pack/unpack in files, and reading them.
Steven D'Aprano
steve at pearwood.info
Sat Nov 14 21:08:11 EST 2015
On Sun, 15 Nov 2015 02:43 am, Ian Kelly wrote:
> On Fri, Nov 13, 2015 at 10:40 PM, Steven D'Aprano <steve at pearwood.info>
> wrote:
>> Python has operator overloading, so it can be anything you want it to be.
>> E.g. you might have a DSL where +feature turns something on and -feature
>> turns it off.
>
> By that argument we should also have operators ~, !, $, \, ? because
> some hypothetical DSL might someday want to use them for something.
No, I'm not saying that. I'm saying that since Python *already* has unary
plus, it can be overloaded to do anything you want. I'm not saying that
hypothetical DSLs are a good reason to add a bunch of arbitrary new
do-nothing-by-default operators.
(By the way, Python already has the ~ bitwise not operator.)
>> Decimal uses it to force the current precision and rounding, regardless
>> of what the number was initiated to:
>>
>> Counter uses it to strip zero and negative counts:
>>
>> I would expect that symbolic maths software like Sympy probably has use
>> of a unary plus operator, but I'm not sure.
>
> Unary plus as normalization does not strike me as being very
> intuitive.
Well, in truth the only truly intuitive interface is the nipple, but using +
for normalisation works for me. It's no more weird than ** for raising to
the power, % for remainder after division, or != for not equal.
>> I might consider stealing an idea from Perl and Javascript, and have
>> unary plus convert strings to a number:
>>
>> +"123"
>> => returns int 123
>> +"1.23"
>> => returns float 1.23
>
> Eww.
Well of course it's "eww" when you write it as a literal, but you wouldn't
do that except to illustrate the concept, that's just silly. But compare:
number = +raw_input("enter a number: ")
versus:
text = raw_input("enter a number: ")
try:
number = float(text)
except ValueError:
number = int(text)
Or worse, people who don't think of try...except will probably try parsing
the string by hand.
text = raw_input("enter a number: ").strip()
if text.isdigit() or text.startswith("-") and text[1:].isdigit():
number = int(text)
else:
# Floats are allowed a leading - or +, no more than one decimal point,
# no more than one exponent starting with E or e, and an optional
# leading + or - sign in the exponent. Everything else must be digits.
mantissa, exponent = number.upper().split("E", 1)
...
And that's about the point where I stopped because correctly parsing floats
by hand is complicated. But the point is that there was a time in my life
as a Python programmer where I absolutely would have done that, rather than
thinking of try...except.
--
Steven
More information about the Python-list
mailing list