this post was submitted on 24 Apr 2025
46 points (92.6% liked)

Python

7041 readers
106 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
you are viewing a single comment's thread
view the rest of the comments
[–] [email protected] 2 points 7 hours ago (1 children)

The notion of truthiness is defined by the language.

Here are most of the built-in objects considered false:

  • constants defined to be false: None and False
  • zero of any numeric type: 0, 0.0, 0j, Decimal(0), Fraction(0, 1)
  • empty sequences and collections: '', (), [], {}, set(), range(0)

It's not something that happens to work, it's literally defined that way.

if not x is the common way to tell if you have data or not, and in most cases, the difference between None and empty data ([], {}, etc) isn't important.

len(x) == 0 will raise an exception if you give it None, and that's usually not what you want. So I guess the verbose way to do that is if x is None or len(x) == 0:, but that's exactly equivalent to if not x, with the small caveat that it doesn't check if the value has __len__ implemented. If you're getting wonky types thrown around (i.e. getting a class instance when expecting a list), you have bigger problems.

I use type hinting on pretty much all "public" methods and functions, and many of my "private" methods and functions as well. As such, sending the wrong types is incredibly unlikely, so not x is more than sufficient and clearly indicates intent (do I have data?).

[–] [email protected] 1 points 5 hours ago* (last edited 5 hours ago) (1 children)

I did not say it's not semantically well defined.

https://en.wikipedia.org/wiki/Brainfuck#Hello_World! -- this is semantically well defined, but it's still vague. Vagueness is a property of how well the syntax is conveying intent.

[–] [email protected] 1 points 3 hours ago

It's only vague if coming from a language where it's invalid or vague semantically. For example:

  • Javascript - [] is truthy for whatever reason
  • C - int x[] = {}; evaluates to true because it's a pointer; C only evaluates to false if something is 0
  • Rust - invalid because you cannot convert a vec -> bool directly, and there's no concept of null (same w/ Go, but Go has nil, but requires explicit checks)
  • Lua - empty tables, zero, and empty strings are truthy; basically, it's truthy unless it's nil or false

The only surprising one here is Javascript. I argue Lua and Python make sense for the same reason, Lua just decided to evaluate truthiness based on whether the variable is set, whereas Python decided to evaluate it based on the contents of the variable. I prefer the Python approach here, but I prefer Lua as a language generally (love the simplicity).