9 ms·
> Python has done a good job of hiding its legacy ugliness (such as __init__, __new__, and similar aberrations), swettening its syntax to accomodate developers
by reedf1 1y ago
> Python has done a good job of hiding its legacy ugliness (such as __init__, __new__, and similar aberrations), swettening its syntax to accomodate developers with good taste.
What exactly is the problem with __init__ or __new__? @dataclass is very nice syntactic sugar, but are we arguing here that having access to initializer/allocator/constructor dunder methods is "legacy ugliness"? This is the core of pythonic built-in aware python. Bizarre.
- wiseowise 1y agoBizarre is that you don’t consider it ugly. Kotlin: constructor is either part of class definition or keyword constructor. Ruby: initialize JS: constructor Python: ______new______, _______init_______ Literally this meme: https://knowyourmeme.com/memes/three-headed-dragon https://knowyourmeme.com/memes/three-headed-dragon
- reedf1 1y agoI had honestly not considered that the author might have been talking about the visual aesthetic of the dunder methods themselves. Honestly that has me a bit stumped; all I can say is that if you don't like underscores, don't pick python.
- t43562 1y agoYou don't call __init__ directly so the ugliness is limited to the definition which seems fairly minimal to me. It seems to be a naming convention for methods that are not invoked by name anywhere and that's at least informative when you're reading the class definition. IMO this is less horrendous than e.g. go's insistence that exported functions are indicated by a capital letter - that really affects code using the module not just the definition.
- NoboruWataya 1y agoI like that magic method names generally all follow the same form so it's obvious that they are magic methods and not intended to be part of the public API. Whether that form uses double underscores or something else doesn't really matter to me as they are not being called directly.
- 63stack 1y agoWould you consider a constructor magic though?
- lou1306 1y ago"Magic methods" is just the name people use for these special methods (another is dunder methods). They're "magic" because you do not call them by name, rather they are invoked by the interpreter in specific situations.
- dragonwriter 1y agoYes, it is magic the same way other magic methods are, that is, because it is syntactically special and callable (and primarily called by) a syntax other than <instance>.<method>(...) or <class>.<method>(instance, ...) Specifically, in the case of constructors, via <class>(...).
- fiedzia 1y ago> it's obvious that they are magic methods and not intended to be part of the public API Is there an alternative API? No. This is public API regardless of anyone's intentions. Though "it's weird" is really not a very strong argument against it.
- trylist 1y agoPublic API refers to the user of the class, not the implementer. You never call __init__ directly. __new__ allows modifying object creation itself for the implementer, but the user of the class will never call it.
- freehorse 1y agoThere are private and public methods. Private methods are only supposed to be called within other methods, as in privately. Public methods are the ones that are normally called through the code, repl, by the user or whatever. You are not supposed to write `myclass.__add__(x)` anywhere except where you define the class itself and its methods.
- dncornholio 1y agoI have found to believe that ugly and beautiful are irrelevant. As long as it's doing the job and not cause major headaches. Life is too short to worry about syntax.
- timeon 1y agoCan you elaborate bit what is the problem here? Is it shape of the characters or something else?
- brabel 1y agoAmazing. If you need to ask this question I am guessing you have spent too long with Python . No other language uses this underscore madness for special methods or otherwise. Because it’s just , I don’t know a more appropriate word for it , stupid.
- deleted 1y ago[deleted]
- Octoth0rpe 1y agoOh yes they do: https://www.php.net/manual/en/language.oop5.magic.php https://www.php.net/manual/en/language.oop5.magic.php The programming languages world is broad/varied enough that any statement like "no other language does this!" is almost certainly wrong (outside of esoteric languages, which python and php most certainly are not)
- deathanatos 1y agoLua, too: __add, __sub, __mul, __div, __mod, __pow, __unm, __idiv __band, __bor, __bxor, __bnot, __shl, __shr __concat, __len __eq, __lt, __le __index, __newindex, __call __gc, __close, __mode, __name
- Twirrim 1y agoWhat's actually amazing is how you're unable to answer a straight question. If you call something "stupid" it doesn't really convey anything meaningful, especially not in the way you're using there, it comes across as "I don't actually have a reason I don't like it, I just don't".
- DrJosiah 1y agoI mean, Python is dynamic. Here, have this: https://gist.github.com/josiahcarlson/39ed816e80108093d585df94f2dbc8b7 https://gist.github.com/josiahcarlson/39ed816e80108093d585df... Now you don't need to write your double-underscore methods ever again, if you don't want to.
- dumah 1y agoI’m not sure why you’re comparing __new__ to constructors in other languages. Ruby has the same thing but it’s called ‘new’. Implementing the type of customization (idiomatically) that __new__ provides in Kotlin and JS isn’t any cleaner.
- parentheses 1y agoThat's kind of the point. These methods are never meant to be called directly. They're used to desugar. I think it's fairly short sighted to criticize these. FWIW, I also did that the first time I wrote Python. Other languages that do similar things provide a useful transparency.
- NewsaHackO 1y agoI don’t think anyone is criticizing its utility, just that the syntax of 2-5(?) underscores in a row isn’t something that is DX friendly.
- dragonwriter 1y agoThe syntax is exactly two, not 2-5.
- JKCalhoun 1y agoI think the point was: who can know by looking at it.
- gcbirzan 1y agoI mean, maybe you should use a font that doesn't make it hard to figure that out. Next you're gonna say we should ban 0s and Os, Is and ls, because your font doesn't allow you to figure out which one it is.
- dragonwriter 1y agoAnyone using a monospacdd font, a font where underscores are separated, or a run-together proportional font that they are even a little bit familiar with, because of the relative width of underscores and other characters. Which, between them, covers approximately everyone.
- hiAndrewQuinn 1y agoThe ugliness is intentional. Nobody wants to name their cool new variable __hot__singleton__in__your__area__.
- __MatrixMan__ 1y agoIt's like the bright orange garments that hunters wear, the ugliness is sort of the point. It says "this is a different sort of thing."
- ddejohn 1y ago> It's like the bright orange garments that hunters wear, the ugliness is sort of the point. Ugliness is not the point of hi-vis vests lol, the point is to not get shot by other hunters.
- __MatrixMan__ 1y ago...by being as shockingly contrasting with their environment as possible. Maybe your aesthetics differ, but I find it quite ugly. If it wasn't, it wouldn't grab my attention so well. Wearing something shockingly ugly is a great way to not be mistaken for a deer. By contrast, I find a well camouflaged deer quite beautiful--once I notice it at all. The beauty comes from the way that it is so clearly a thing of its surroundings. Nothing at all like a bright orange hat.
- ddejohn 1y ago> Wearing something shockingly ugly is a great way to not be mistaken for a deer. Sure... yes the bright orange is ugly, but it's not the ugliness that prevents you from getting shot, it's the bright unnatural color. Other hunters aren't thinking "oh that's really ugly, it must not be something I can shoot" they're thinking "bright orange means person, I should not fire my rifle in that direction". > If it wasn't, it wouldn't grab my attention so well. Are you saying that if you thought the bright orange was pretty it wouldn't occur to you not to fire your gun in its direction?
- __MatrixMan__ 1y agoIf I thought that bright orange was a part of a healthy forest ecosystem, I would likely see beauty in it. And if my intent was to shoot denizens of such an ecosystem, then yeah bright orange would make a poor indicator for "don't shoot here". You'd be better off with something ugly, something which clearly doesn't belong.
- guhcampos 1y agoSome-other-language-user complaining about python ugliness:_____new_____ and _____init_____ Same-other-language-user: ((()))()()()({}{}{{(((())){}}}}{}{}{};;;;();)(;}}} *not supposed to be correct syntax, it's just a joke
- slightwinder 1y agoAs if other language don't have their warts.. Ruby and Javascript for example have hideous syntax, comparing this with some special naming is quite bizarre. But who cares? It's syntax, it has its purpose.
- moffkalast 1y agoI would think the dumber thing is having to create an empty file called __init__.py for a package to register as a package. And relative imports being completely fubar.
- kolanos 1y ago> I would think the dumber thing is having to create an empty file called __init__.py for a package to register as a package. This hasn't been true since Python 3.3. You no longer need a __init__.py for Python to recognize a module, but it can still be useful in many cases.
- maleldil 1y agoThis is incorrect. > The __init__.py files are required to make Python treat directories containing the file as packages (unless using a namespace package, a relatively advanced feature). https://docs.python.org/3/tutorial/modules.html https://docs.python.org/3/tutorial/modules.html
- mixmastamyk 1y agoThe point is to keep them out of the object namespace, and works well for that.
- DrJosiah 1y agoI mean, it's never been a problem for me in my 26 years of Python, but if it is such a big deal for you, maybe you should consider this: https://gist.github.com/josiahcarlson/39ed816e80108093d585df94f2dbc8b7 https://gist.github.com/josiahcarlson/39ed816e80108093d585df... I wrote it in about an hour and a half. It seems to work in Python 3.6 and 3.12. Now you never need to write another double-underscore magic method again.
- adw 1y agoFewer characters than “initialize” or “constructor”, clearly marked as being “not a normal method”. Python is better here.
- dragonwriter 1y agoIf you felt your argument about __new__ and __init__ was valid, you probably would have used the actual names and not hyperbolic exaggerations.
- thaumasiotes 1y agoProbably the system of giving special meaning to what are otherwise ordinary identifiers. __ isn't a reserved keyword in Python or anything. But there's a set of conventions you're supposed to follow when naming methods and attributes, and they're visibly artificial. It would be cleaner to make the features that are a special part of the language definition also a special part of the language syntax instead of running them in indistinguishably with other nonsimilar things. In C++, if you want to define the binary + operator on a class, you give the class a method with the special name `operator+`. In Python, to do the same thing, you give the class a method with the pseudo-special name `__add__`. You don't think the Python way is worse?
- reverius42 1y agoI'm not sure how "operator+" is supposed to be appreciably different from "__add__".
- brabel 1y agoOne is a sensible choice a human might pick. The other is not.
- orphea 1y agoBoth are doing their job just fine?
- acdha 1y agoSo who were the non-humans who picked the one you don’t like?
- dragonwriter 1y agoThey are both sensible choices that a human did pick, that's how they got into their respective languages.
- WesolyKubeczek 1y agoThey have different locality of behavior, for one.
- andyjohnson0 1y ago> What exactly is the problem with __init__ or __new__? @dataclass is very nice syntactic sugar, but are we arguing here that having access to initializer/allocator/constructor dunder methods is "legacy ugliness"? My read was that the "ugliness" was in the method naming, and specifically the double underscores, not the availability of the methods themselves.
- lenerdenator 1y agoI've been doing Python professionally for a while (~10-ish years in backend web dev and file processing), and while I don't like how exactly the author described dunder methods as "legacy", it's still not a language facility I reach out to often because, well, it's sort of odd coming from a C# background. The author has blog posts about Java, which isn't that different from C#, so maybe that's the reason. Maybe as I grow to think of the "big picture" architecture-wise with my code, I will start incorporating dunders, but until then...