18

I use in Python the package pydantic and the linker Flake8. I want to use constr from pydantic with a regular Experssion. Only certain Characters should be passed. (a-z, A-Z, 0-9 and _)

The regular Experssion "^[a-zA-Z0-9_]*$" works, but flake8 shows me the following error:

syntax error in forward annotation '^[a-zA-Z0-9_]*$' flake8(F722)

class RedisSettings(BaseModel):
    keyInput: constr(regex="^[a-zA-Z0-9_]*$") = "" 
    keyOutput: constr(regex="^[a-zA-Z0-9_]*$") = ""

Can you help me to avoid the Error Message?

anthony sottile
  • 61,815
  • 15
  • 148
  • 207
Phil997
  • 575
  • 5
  • 15

3 Answers3

23

the error here comes from pyflakes which attempts to interpret type annotations as type annotations according to PEP 484

the annotations used by pydantic are incompatible with PEP 484 and result in that error. you can read more about this in this pyflakes issue

I'd suggest either (1) finding a way to use pydantic which doesn't involve violating PEP 484 or (2) ignoring the errors from pyflakes using flake8's extend-ignore / # noqa: ... / per-file-ignores


disclaimer: I am one of the pyflakes maintainers and I am the current flake8 maintainer

anthony sottile
  • 61,815
  • 15
  • 148
  • 207
  • ok, thanks, now I understand the mistake. I have added the flake8 message to the ignore list. (2) – Phil997 Nov 20 '20 at 13:16
4

You can extract the constr(..) statement to a separate variable:


KeyTypeStr = constr(regex="^[a-zA-Z0-9_]*$")
KeyOutputStr = constr(regex="^[a-zA-Z0-9_]*$")

class RedisSettings(BaseModel):
    keyInput: KeyTypeStr = "" 
    keyOutput: KeyOutputStr = ""

It looks even cleaner like that, and the type annotation can be reused easily, even in other modules.

0

Follow:

How about:

from typing import Annotated

from pydantic import BaseModel, Field


class RedisSettings(BaseModel):
    keyInput: Annotated[str, Field(regex=r"^\w*$")] = ""
    keyOutput: Annotated[str, Field(regex=r"^\w*$")] = ""
Zero
  • 3
  • 2