On 10/23/2022 11:14 PM, Dan Stromberg wrote:
On Sun, Oct 23, 2022 at 2:11 PM Paulo da Silva <
p_d_a_s_i_l_v_a...@nonetnoaddress.pt> wrote:

Hello!

I am in the process of "typing" of some of my scripts.
Using it should help a lot to avoid some errors.
But this is new for me and I'm facing some problems.

Let's I have the following code (please don't look at the program content):

f=None  # mypy naturally assumes Optional(int) because later, at open,
it is assigned an int.
..
if f is None:
         f=os.open(...
..
if f is not None:
         os.write(f, ...)
..
if f is not None:
         os.close(f)

When I use mypy, it claims
Argument 1 to "write" has incompatible type "Optional[int]"; expected "int"
Argument 1 to "close" has incompatible type "Optional[int]"; expected "int"

How to solve this?
Is there a way to specify that when calling os.open f is an int only?

I use None a lot for specify uninitialized vars.


I've found that mypy understands simple assert statements.

So if you:
if f is not None:
         assert f is not None
         os.write(f, ...)

You might be in good shape.

I'm not very familiar with anything but the simplest typing cases as yet, but mypy is happy with these two fragments.

if f:
os.write(int(f)) # f must be an int if it is not None, so we can cast it to int.

Or something like this (substitute write() for print() as needed) -

from typing import Optional, Any

def f1(x:int)->Optional[int]:
    if x == 42:
        return x
    return None

def zprint(arg:Any):
    if type(arg) == int:
        print(arg)

y0 = f1(0)  # None
y42 = f1(42) # 42

zprint(y0)  # Prints nothing
zprint(y42) # Prints 42

Another possibility that mypy is happy with (and probably the simplest) - just declare g:int = None instead of g = None:

g: int = None
def yprint(arg: int):
    if arg:
        yprint(arg)
    else:
        print('arg is None')

yprint(g)  # Prints "arg is None"


And **please** let's not go doing this kind of redundant and inelegant construction:

if f is not None:
    assert f is not None
    os.write(f, ...)
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to