On Wednesday, March 3, 2021 at 10:37:01 AM UTC-6 [email protected] wrote:
Thanks for these comments. They inspired me to dig a little deeper into
what is going on.
There could be a special instance of p that plays the role of null, in that
> it returns None when tested. Call it p_none. mypy would recognize it as
> the same type as type(p) so it would be type safe, and p.__bool__ would
> return False when tested if p were p_none. There would only need to be one
> p_none instance.
>
This won't work. Recall that p.moveTo* methods change p in place. They
don't return a value, and there is no way in python to alter references to
p in the caller.
I'm not sure how many different places in the codebase that p is set to
> None. If it's only a few, changing them all to set p to p_none instead
> shouldn't be hard or dangerous.
>
There are only two methods, but several other position methods call those
two methods, so all told there are about a dozen. In any case, setting p to
p_none is simply impossible.
mypy gives 27 errors when I annotate p.v to be Optional["VNode"] . These
errors basically all say that p.v.any is invalid if p.v is None. This is
perfectly proper on mypy's part. As I said earlier, Leo's scripting api
works because all scripts, including Leo's core, are supposed to test p
after any of the p.moveTo* methods. In practice, these tests happen
naturally. The typical patterns are:
for p in c.all_positions():
whatever
or
while p:
whatever
p.moveToThreadNext()
In the first example, the test happens behind the scenes. In the second
example, the test is part of the loop.
One could imagine removing the 27 errors by using guards, but nothing would
be gained by doing so. Suppose the guard fails. Now what? I'm not going
to pollute code with error returns, so the only choice is to raise a
Leo-specific exception, say, ScriptingError. But Leo's main loop already
catches all exceptions, so there is no real benefit.
Edward
--
You received this message because you are subscribed to the Google Groups
"leo-editor" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/leo-editor/d8b13b60-33f2-4927-967f-895525cb1a2bn%40googlegroups.com.