23

For example:

class FooBar:
    def __init__(self):
        self.a: int = None
        self.foo: str = None

Is this bad practice/go against PEP guidelines or is it fine?

top 12 comments
sorted by: hot top new old
[-] joyjoy@lemmy.zip 23 points 2 days ago

Implicit optional is deprecated. Explicitly use self.foo: int | None = None

[-] AstroLightz@lemmy.world 4 points 2 days ago

Thanks! Good to know.

[-] Vulwsztyn@programming.dev 2 points 1 day ago* (last edited 1 day ago)

yes, bad practice; yes, against PEP

[-] jtrek@startrek.website 8 points 2 days ago

That seems like that's going to give you an error in most type checkers. You said it's always an int and then immediate made that a lie and made it None instead.

Why are you trying to do this?

[-] AstroLightz@lemmy.world 2 points 2 days ago

I'm initializing variables that would be used later in the class in different functions. I wasn't sure if I needed to do a var: <type> | None = None or if just setting it to None was fine.

[-] solrize@lemmy.ml 5 points 1 day ago* (last edited 1 day ago)

I'm going to say initializing them to None and updating them later is a code smell. If you can do so, make them non-optional and always initialize them to actual meaningful values.

[-] jtrek@startrek.website 5 points 1 day ago

Yeah, if you initialize them to None then for the entire rest of the class you're going to have to account for the possibility that they're None. If it's unavoidable that they might be None, you should type it as such.

If you type them as like str | None then later when you do like return foo[0] it will warn you that you can't do that with None.

[-] solrize@lemmy.ml 2 points 1 day ago

foo[0] is also unsafe unless foo is known to be nonempty, ofc.

[-] jtrek@startrek.website 1 points 1 day ago

Technically correct , the best kind of correct.

foo.lower() would have been a better example.

[-] sbv@sh.itjust.works 3 points 2 days ago

Why not require values in the constructor?

[-] AstroLightz@lemmy.world 2 points 2 days ago

This is an example. For my actual use case, they would be private vars that would be set by class functions instead of passed to the constructor.

[-] solrize@lemmy.ml 1 points 1 day ago

If it can be None then the type is Optional[int] or Optional[str] as the case may be. Or I guess now int | None etc. I'm used to older versions of mypy so idk if they support that alternate syntax.

Optional[int] would seem to be preferable but it turns out it's not really an option type. Like Optional[None] being None is ambiguous.

this post was submitted on 16 Mar 2026
23 points (100.0% liked)

Python

7812 readers
4 users here now

Welcome to the Python community on the programming.dev Lemmy instance!

📅 Events

PastNovember 2023

October 2023

July 2023

August 2023

September 2023

🐍 Python project:
💓 Python Community:
✨ Python Ecosystem:
🌌 Fediverse
Communities
Projects
Feeds

founded 2 years ago
MODERATORS