[HN Gopher] Black, the uncompromising Python code formatter, is ... ___________________________________________________________________ Black, the uncompromising Python code formatter, is stable Author : crlees Score : 211 points Date : 2022-01-29 20:53 UTC (2 hours ago) (HTM) web link (pypi.org) (TXT) w3m dump (pypi.org) | robertlagrant wrote: | Here's the best thing about Black: | | Python has significant whitespace, so you can't just click | "ignore whitespace changes" in Github diffs and it doesn't | matter. You have to put up with every silly whitespace change. | | Until Black. | robertlagrant wrote: | 5 upvotes generate a pro tip: have your CI run black --check | against the code you want formatted. That way different devs | can run the formatting how they like (in tox; in a pre-commit | hook; in IDE; on the command line) and CI just enforces that it | _happened_. | topper-123 wrote: | > Black is opinionated so you don't have to be. | | This is a very nice quote and sums up my own view on black (and | code formatters in general) nicely. Thera are things you don't | really want to have an opinion about. | vogre wrote: | I think every language should have such tool by default, like Go | does. | _tom_ wrote: | Long ago, I worked at a company that decided it needed coding | standards. We spend two weeks arguing about coding standards. | Nothing else got done. | | Ever since then, I am not opinionated about coding standards. The | benefits do not match the costs. | | Although I do like the approach of "use something like black on | precommit", and if you don't like it, you can reformat to your | standards on check out, and be happy. It will get fixed on check | in. | voidfunc wrote: | Sort of why I think Go got it right with gofmt. Its not as | strict as it could be but all Go looks more or less the same | and it's because it was built into the language | colechristensen wrote: | Too many people have too strong opinions on the subject. Some | things are reasonably good ideas, many more are just arbitrary, | strict rules prevent doing reasonable exceptions, and an | enormous amount of time is wasted discussing the matter. | _3u10 wrote: | its the penultimate bike shedding issue. | | If you're coders can code it doesn't matter, and if they | can't formatting their poor code isn't going to fix it. | colechristensen wrote: | Just an off topic note on language: penultimate means | second to (last, final, biggest, etc), i.e. the one before | the ultimate. Perhaps an odd choice of word in context that | is often misunderstood. | | It leads to the question "then what is the ultimate bike | shedding issue?" | keithasaurus wrote: | To me, the point of using code formatters is that you don't | have to think/talk about code formatting much at all. As in, | there are never annoying comments about formatting in PRs. | | A nice bonus is that you end up having uniformly readable code. | dgellow wrote: | Yep, just agree on something, whatever it is, enforce it | everywhere and move on. It's not worth the time arguing. I love | gofmt for this. | surfmike wrote: | Arguing over coding standards is harmful, but consistency is a | good thing. Best to adopt a standard style guide and limit any | debate to deviations and even better to have a tool like Black | make it automatic. | danielvaughn wrote: | Yep. Even if I personally hate a coding style, I'll stick to | it religiously if it's what my team uses. A good coding style | is one that everyone adheres to. | ForHackernews wrote: | Still ugly. I hate looking at code mangled by this thing. Single | quotes? Fluent interfaces? Go write Go if you want ugly code you | don't have to think about. | | Don't @ me. | throwaway894345 wrote: | Pretty sure Black prefers double quotes in the main case, but | what are "fluent interfaces"? Go is pretty great though, I | completely understand the envy! :) | JacobHenner wrote: | https://en.wikipedia.org/wiki/Fluent_interface | throwaway894345 wrote: | Does Black inhibit method chaining? In any case, I don't | see the value in fluent interfaces--if I had to choose | between an opinionated code formatter and something people | do because Martin Fowler told them to do it, I would take | the former every time. | cdcarter wrote: | Sure, but why would black make those hard? (It doesn't, in | my experience). | captainmuon wrote: | Personally, I don't understand the appeal of opinionated code | formatters. If you don't want to discuss "taste" questions, then | just don't, it doesn't matter what option you pick. If it is an | important question, then you _should_ debate it. | | I think you can convey meaning with subtle code style | differences. Empty lines to delineate blocks. Single quotes if | the string is a keyword, double quotes if it is for the user. | Spaces around operators to make an expression clearer. I spend a | minute or two before I commit to make the code tidy (linter and | then manual tweaking) and would expect that from everybody on my | team - it takes often less time than rebasing and picking good | commit names, for example. | | But even though it annoys me slightly when I encounter Black (or | god forbid, Go) used in a project, I know a lot of people like it | a lot, and it is good to have the choice. So congrats to the | release! :-) | onphonenow wrote: | The reason I like black is the most opinonated folks have WEIRD | opinions. | | You see that here. | | Things like a = [ 1, 2, 3 ] when 90% of the world is a = [1, 2, | 3] | | These folks will spend hours / days try to force weird | approaches. | | Sometimes they are obviously wrong. But it's annoying to have | to fight over it. Something like black saves you the hassle and | the WEIRD local coding rules someone comes up with if you are | on a project with them. | throwaway894345 wrote: | I can stop discussing taste issues, but it doesn't prevent | others from debating what the proper style for my PR ought to | be, meanwhile I can't merge my PR. | Shacklz wrote: | > I think you can convey meaning with subtle code style | differences. | | Yes that's very true, but, and now comes the big but - if | you're working in a project with dozens and dozens of other | devs, you will necessarily see all kinds of weird formatting. | And this is where an opinionated formatter shines. It doesn't | matter how many people work on your project, what the churn- | rate is or if the guy that just started yesterday already read | the code-formatting guidelines or not - the formatter will just | take care of it and remove all hassles surrounding that topic. | And this only at the price of opinionated formatting which I | may or may not like - a price that I likely have to pay either | way, because there's no way that everybody shares the same | opinion about formatting in the first place. | | I recommend to give opinionated formatters a try, if you | haven't already. I know plenty of folks who were initially | against it but eventually came around it because it made life a | lot easier: No more discussions about formatting on PRs, no | more tabs vs space wars, everything's already settled and | automatically taken care of. | ferdowsi wrote: | > If you don't want to discuss "taste" questions, then just | don't, it doesn't matter what option you pick. If it is an | important question, then you should debate it. | | I'm personally glad to see Python development come to the same | conclusion enforced by Go's opinionated tooling. | | That is: style questions are almost always unimportant to | producing value, but teams still waste excessive time on them | because of the engineering tendency to bikeshed triviata. | mumblemumble wrote: | I think the general consensus of many people, myself included, | is that it doesn't matter what the specifics are, as long as | they're being applied consistently. Beyond that, it's a | question of optimizing the cost/benefit ratio. | | The problem with most things that have to be applied manually | is that they're also applied inconsistently. It's like | Hungarian notation. Over time, it becomes pure noise: you can't | rely on it, especially when reading someone else's code, so | it's safer to just ignore it. At which point, the convention's | cost/benefit is approaching infinity, because its denominator | nearly zero. So I'm not sure I care if the absolute cost is | small. It's still an almost complete waste of effort. | | The only place I've ever seen manual conventions applied | consistently enough to be useful in a sustainable way is when | someone's carved out their own private silo of code that is | mostly only touched by them. | monsieurbanana wrote: | > If you don't want to discuss "taste" questions, then just | don't, it doesn't matter what option you pick. | | Exactly, it doesn't matter what option you pick, _as long as | everybody picks the same option_. Enter opinionated code | formatters, because otherwise how do you do it? | colechristensen wrote: | > otherwise how do you do it? | | Only reject obviously quite messy code, and only rarely allow | formatting rewrites. Learn that anybody's strong preferences | for a specific style or discussion of such aren't | demonstrably beneficial for the bottom line of the business | or customers. | dragonwriter wrote: | > Personally, I don't understand the appeal of opinionated code | formatters. | | Opinionated code formatters mean that opinionated coders with | different preferences on a team don't produce (or at least | produce less) noise in diffs. | erik_seaberg wrote: | I only reformat code I am rewriting, for that reason. I've | never seen a tool that was very good at bending its own rules | to minimize these accidental changes. | Closi wrote: | > Personally, I don't understand the appeal of opinionated code | formatters. If you don't want to discuss "taste" questions, | then just don't, it doesn't matter what option you pick. | | I think the appeal is that it _avoids the discussions entirely_ | (i.e. if it doesn 't matter what option you pick, why even have | the option? Particularly if these options will mean you divert | away from the standard python style guide, which has been | trying to standardize these choices for years so that codebases | have similar rules.) | | i.e. if your org has inconsistent python formatting between | different independently-operating teams, it's easier to enforce | PEP 8 than start a load of pointless arguments about what good | looks like. | MrPowers wrote: | I like Black for normal Python code, but it seems to mangle | Pandas / Dask code at times. I still use it extensively cause it | doesn't seem like there are other good alternatives. | | I wrote a blog post on how to use Black in Jupyter Lab notebooks | if anyone is interested: https://coiled.io/blog/code-formatting- | jupyter-notebooks-wit... | | It's really nice to format a notebook with the click of a button. | iddan wrote: | This is exciting! Can it now be a plug-in for Prettier? | sergiotapia wrote: | Huge milestone for the Python community! Very happy for you guys. | In Elixir, `mix format` has saved so much time across multiple | projects and teams. I can't remember the last time I talked about | line breaks and how to divvy up a long multiple line function | header. | formerly_proven wrote: | > Black prefers [i.e. converts] double quotes (" and """) over | single quotes (' and '''). | | Can someone explain this to me? Why would you ever prefer " over | ' in a language where both can be used equally? | HALtheWise wrote: | Additionally, standardizing all quotes makes searching for a | specific string literal across a codebase easier, since you | don't need regex to match against both quote types. Once you've | decided to standardize strings, it doesn't matter much which | one you pick. | | Personally, I still type single quotes in almost all cases, and | just let Black reformat to double quotes to save shift key | presses. | mixmastamyk wrote: | Try nero from PyPI instead, I'll upgrade to stable shortly. | rirze wrote: | Last commit was from 2019? It sounds like you're not | automating the patch for every black release... | floober wrote: | Uniformity, presumably | odiroot wrote: | I prefer them too. Makes it easy to notice than single ones. | It's just a personal preference, there's no big logic behind | it. | Teongot wrote: | Because "don't" is easier to read than 'don\'t' | shpx wrote: | Black will use single quotes if your string contains double | quotes and no single quotes. It'll reformat | print("\"Hello\" he said") | | to print('"Hello" he said') | | I think pretty much all formatters for languages that let you | use either quote do this. It makes sense. | JackFr wrote: | When you're embedding SQL in a string, a you use ' a lot more | than ". Not the only use case, but one to give some | consideration. | throwaway894345 wrote: | I think that's only MySQL. Postgres uses double quotes for | identifiers and single quotes for literals. | | EDIT: I misinterpreted that single quote as a backtick. In | any case, both single and double quotes are common in SQL, | but single quotes are a bit more common. | iqanq wrote: | And 'do not' is easier to read than both :) | breput wrote: | A couple of possible reasons: | | * Double quotes are more visible, especially for triple quotes. | | * It makes it easier to have text without having to manually | escape apostrophes. | teddyh wrote: | Because _most_ commonly used languages use double quotes, not | single quotes, for string literals. Some languages can use | both, either interchangeably or with slightly different | semantics, but others either uses single quotes for other | purposes, or do not use them for anything at all. Therefore, | double quotes for strings look more normal, so to speak, in | source code. | tsimionescu wrote: | Except that in the language you're most likely to mix with | Python, SQL, strings are in single quotes (double quotes are | for identifiers like column names, especially if they're case | sensitive). So it's probably a bad choice on Black's part. | drekipus wrote: | It's a tic for me too, as I always prefer '. | | But to be fair I think it's because 1. Double quotes are | ""universally"" strings in other languages 2. Having | apostrophes gets annoying. | | The great benefit really is that I _can_ write single word | strings just fine, and black will adjust it for me. I get my | cake, and so do the others. | ambivalence wrote: | This was decided very early in the project, the discussion can | be read here: https://github.com/psf/black/issues/51 | formerly_proven wrote: | Did you lock that issue before posting it here? Is this some | kind of sore/forbidden topic for the project? | | Edit: I suppose the question is superfluous seeing how many | replies there are just here. | ambivalence wrote: | Yes, and yes. Edit: and yes. | wging wrote: | Also documented more permanently here: https://black.readthed | ocs.io/en/latest/the_black_code_style/... | nopenopenopeno wrote: | It's easier and faster to differentiate between " and ` than | between ' and `. | indymike wrote: | This is simple: the default is picked, so now no one has to | argue about it. | TameAntelope wrote: | Arguing over Black formatting choices is a little ironic, isn't | it? | | The whole point is that they're all arbitrary so just let the | defaults win, and adjust yourself instead. | kstrauser wrote: | That was the thing that bugged me at first, but other people on | my team loved it. Some things bugged other people on my team, | even though I love them. If a tool can manage to annoy everyone | about the same amount, but in different areas, it's doing | something right. | | And while it's still kind of strange that `a = "foo"` looks | different than `repr(a)`, after a while of using Black I don't | notice it anymore. | faangiq wrote: | In some languages single vs double has different functionality. | nu11ptr wrote: | I don't always like Black's results, but I do like the | opinionated nature in general and that I don't have to sit and | think about how I want it configured. Wouldn't mind a few knobs | though. | throwawayt215 wrote: | Hooray! | | Loosely related - This is Python pip. Trail of Bits has a tool | pip-audit that audits Python environments and dependency trees | for known vulnerabilities. | | https://github.com/trailofbits/pip-audit | woodruffw wrote: | Not that I don't appreciate the shoutout (I'm one of the | developers of pip-audit), but what's the connection? Is it | because black is installed via pip? | throwawayt215 wrote: | Yeah. Thanks for pip-audit | hivacruz wrote: | This is a great tool. I wish there was some settings to use | single quotes instead of double quotes. | nopenopenopeno wrote: | There probably is, if you use another formatter that isn't | Black. | xapata wrote: | I like yapf. | crlees wrote: | There is: -S, --skip-string-normalization Don't normalize | string quotes or prefixes. | hivacruz wrote: | IIRC, the -S only avoid single quotes to get switched to | double quotes. What I meant was allowing Black to switch | double-quotes to single quotes automatically. | mixmastamyk wrote: | Try nero from PyPI instead, I'll update it to this stable | release shortly. | j1elo wrote: | Funny that this is a common reaction against opinionated tools: | " _I wish there was a configurable option to apply my opinions_ | " | | But the whole idea is that you should learn to suppress your | ego and let the tool be the one dictating stylistic choices... | | Like the sibling comment mentions: | | _Dusty Phillips, writer:_ | | " _Black is opinionated so you don't have to be._ " | ForHackernews wrote: | "My opinion is the correct one" | | - Author of some tool | throwaway894345 wrote: | "No opinion is correct, so we should stop wasting time | debating it." | | - advocates of code formatters | hivacruz wrote: | I understand that. And this is what I like in Black. But the | single quotes thing is really up to debate. When you use it | with other tools such as flake8 or pylint, you have to | disable a bunch of things to make them work together because | no one agrees on this point. | historyforsale wrote: | > When you use it with other tools such as flake8 or | pylint, you have to disable a bunch of things to make them | work together | | Using Flake8 with Black requires only two configuration | options [1], while Pylint requires three [2]. If you prefer | to use Black with --line-length 79, then it's down to a | single configuration option for Flake8 or two for Pylint. | | [1]: https://black.readthedocs.io/en/latest/guides/using_bl | ack_wi... | | [2]: https://black.readthedocs.io/en/latest/guides/using_bl | ack_wi... | j1elo wrote: | I'm not a full time Python dev so I won't (can't) get into | what choice has more merits. But there is this: | | https://black.readthedocs.io/en/latest/the_black_code_style | /... | | Seen from outside, I think the double quotes are just the | natural form of strings in lots of other places, at least | in those that come from the same family than C (C++, Java, | C#, Rust, just to name a few) | | Also Prettier.js (which I'd call the "Black of JavaScript") | also settled on double quotes. So we're left with a _de | facto_ consensus across programming languages as a whole, | which kind of feels nice. | _tom_ wrote: | That made me wonder, so I went and tested edge cases, like | "abc\"d\"ef", which black quite properly converts to | 'abc"d"ef'. So it does use single quotes where appropriate. | EddieLomax wrote: | It's now enabled by default in IPython, for better or worse: | https://github.com/ipython/ipython/pull/13397 | ccordoba12 wrote: | That will be reverted in the next version, i.e. it'll be | optional. | teddyh wrote: | "the next release will likely revert it" | | -- Matthias Bussonnier, | https://github.com/ipython/ipython/issues/13463#issuecomment... | kzrdude wrote: | Great, I'm sure it will end up with a good solution | eventually. Unfortunate that it had to be this heated about | this change. | | R. Hettinger needed to learn to always be graceful when | commenting or criticizing the work of others, especially | volunteers. | | And we all saw how wild the difference is in engagement for a | project like ipython between the "normal" level and the | "viral" level. Users are just using it and depending on it, | never interacting with the project, but if something attracts | attention it can be like a thousand flies flocking to it. | Often when something gets negative attention.. | crlees wrote: | I'm pleased to announce that Black is finally non-beta software! | :party:! | | Change log: | https://black.readthedocs.io/en/latest/change_log.html | | Going forward we'll follow our stability policy (https://black.re | adthedocs.io/en/latest/the_black_code_style/...). | | Work continues as usual with bugfixes and enhancements, but style | changes are now introduced under our new `--preview` CLI switch. | This allows us to evolve Black's style without too much | disruption to users that want consistency. The default style is | updated yearly. | | Thanks to our maintainers for orchestrating the efforts, | especially to our most recent reinforcement Batuhan | (@isidentical) who was responsible for our match statement | support! A hearty thank you to all of our contributors for | pushing Black forward, and to our users for being the reason we | do it! | scrollaway wrote: | Congratulations. I'm a Python developer of 17+ years and Black | is truly a huge blessing in the Python ecosystem. | | That said, I'm a little sad to see it's gone stable without | adding support for tabs, which would be extremely simple to add | at this point (cf. https://github.com/jleclanche/tan/commit/e23 | c038167528bdacdd...). I have a lot of people using this tab- | capable fork, that I did not advertise anywhere. | | Lukasz seems to have a personal grudge against tabs which may | be why the issue for tab support was closed early on, but | there's a plethora of good reasons to support it behind a flag. | I don't want to rehash those arguments here on HN but you think | you could re-think the approach a bit? | | I'd be happy to do a PR if it's not getting rejected right away | with "no discussion allowed" like the last one was (before | Black was moved to PSF maintainership). | [deleted] | gbarboza wrote: | is it just me, or does the logo look _really_ similar to the ford | logo? | scrollaway wrote: | It's meant to, as it references Henry Ford's "any color so long | as it is black" quip. | jreese wrote: | Shameless self-promotion, as a former coworker of Lukasz, Black's | creator: | | Another coworker and I have created an import sorter that fits | well alongside Black, called usort. It is designed from the | ground up to be a safe, stable import sorter that won't move | imports in ways that potentially change behavior of the codebase, | and without needing developers to litter their code with "skip" | directives. We use it in our daily formatting codemods on tens of | thousands of source files every day, and just finished our 1.0 | release in December. | | https://usort.readthedocs.io | | Going further, if you like enforcing both formatting and import | order in your CI pipeline, I also created the project ufmt, which | combines both Black and usort into a single, atomic formatting | step. This ensures there's never any conflict of opinion between | the two tools, and any formatting changes are presented as a | single diff result. | | https://ufmt.readthedocs.io | chrisseaton wrote: | > that won't move imports in ways that potentially change | behavior of the codebase | | How can that be the case? Can't Python imports have behaviour | that varies on the time of the day if they want? | | An import could monkey patch a basic operation one day but not | the next. | stefan_ wrote: | Even better, you can overwrite the default importer to | substitute your own with any behavior you want. Used in EVE | Online to do their "hide the python code somewhere" scheme. | jreese wrote: | Absolutely! We're hoping that the vast majority of modules | are good citizens, but we also know that the reality not | perfect. That's why usort allows you to configure a list of | modules with known import-time side effects, and usort will | then treat those are barriers everywhere. | | https://usort.readthedocs.io/en/stable/guide.html#side- | effec... | [deleted] | wcdolphin wrote: | Interesting. Now that isort has support for black- | compatibility, what's the main difference with usort? | jreese wrote: | We've written a number of words on "Why usort", including a | comparison to isort: | https://usort.readthedocs.io/en/stable/why.html | | The biggest reason is usort's detection of sortable "blocks" | of imports, and only sorting within those blocks to limit | breaking changes, combined with use of proper parsing and CST | manipulation to guarantee valid syntax after sorting. | stdbrouw wrote: | FWIW, there's one particular use case where the isort | behavior is incredibly useful: in eval-as-you-type data | science e.g. when using Hydrogen in Atom you type an import | whenever you need it but that leads to a lot of duplication | and imports scattered across the file, and it's nice that | isort just moves that up top on every save. | jreese wrote: | That's something we're aware of, and something we've | considered, but also potentially dangerous from a safety | standpoint, due to Python's dynamic nature, and how much | moving imports can affect runtime semantics. Any | implementation of this would need to be aware of those | dangers, and also be able to provide stable and | predictable behavior. At the moment, it's not a huge | priority given the availability of tooling to | automatically add missing imports, or the limited impact | of under-sorting in the context of notebooks. | wcdolphin wrote: | Very cool. I love the idea of one tool rather than two, | I'll check it out! | nopenopenopeno wrote: | Thought I'd never see the day lol | Mockapapella wrote: | Fuck I love Black -- makes working with other developers amazing | once you stick it in a precommit. The quote from Dusty Phillips | on the homepage is perfect and has stuck with me for years. I | don't have to debate with developers about their individual | preferences over what's best because we can just use Black and be | done with it. | Alex3917 wrote: | The problem I have with it is that, to me, these are super | readable: x = [ 1, 2, 3 ] y = { 'a': | 1, 'b': 2 } | | Whereas these are not: x = [1, 2, 3] | y = {'a': 1, 'b': 2} | | To me, declaring inline lists and dicts without the leading and | trailing space makes it more difficult to see what the data | structure is, and what it contains. This is especially true | when you have lists or dicts declared inline as arguments to | functions, e.g.: my_function_call([ 1, 2, 3 | ]) | | versus: my_function_call([1, 2, 3]) | | While it's generally not good style to declare data structures | inside function calls, at least with the space it's still | somewhat apparent what's happening, whereas without the space | it just looks like three positional arguments. I love the idea | of black, but in practice I'm not going to use something that | changes my own code into something that's more difficult for me | to read. | spiderice wrote: | My only response to this would be "get used to it". | | I used to think 2 space tabs made code harder to read than 4. | Now I used 2 spaces and I've gotten used to it and can read | it fine. And I have no doubt you could learn to read the | black formatted code just as easily. I can, since that is how | I format my code anyway. | NavinF wrote: | That's gotta be a really unpopular opinion since I've never | seen anyone write "[ 1, 2, 3 ]" instead of "[1, 2, 3]" in the | last 10 years or so. | | If anything I'm seeing the opposite trend with a few devs | writing "[1,2,3]" so that large constant literals don't | overflow the line. | LegionMammal978 wrote: | I've recently been working with an old C++ codebase that | formats every function call like this: | Foo<Bar,Baz> value = some.method (1, 2, 3 + 4) ; // | or with no parameters: value = some.method() ; | | I've never seen it anywhere else, and it took me a good | week to get used to it. | throwaway894345 wrote: | Agreed. My only grievance with Black was that it was really | slow compared to gofmt or rustfmt, but that's a perennial | problem with Python tooling. | ambivalence wrote: | This is now improved. Black is compiled with mypyc, should be | roughly 2X faster than before. | throwaway894345 wrote: | Oh, good to know! | mumblemumble wrote: | I love it even though I dislike quite a few of its formatting | rules. | | Because the only thing worse than a slightly wonk formatting | convention is spending any time at all implementing, arguing | about, or otherwise worrying about formatting conventions. | unfunco wrote: | Rob Pike's proverbs about Go fmt springs to mind: "Go fmt's | style is nobody's favourite, but go fmt is everybody's | favourite." | javajosh wrote: | Word. I got major pushback trying to fix this problem at my | last company, which is (in part) why I'm not there. | crlees wrote: | Here here! Same. | teddyh wrote: | NB: It's "Hear, hear", not "Here, here". | crlees wrote: | Thanks mate. | oever wrote: | We never agreed on the indents | | I typed a hundred tabs | | You go back to space and I go back to black | CyberShadow wrote: | One missed opportunity in Black's algorithm is that it currently | treats the maximum line length as a literal hard limitation in | number of characters. Here is a trivialized example: | to_add = [item for item in data.new_items if item not in | data.old_items] to_remove = [ item for item | in data.old_items if item not in data.new_items ] | | Although the constructs are nearly structurally identical, they | can be formatted very differently, which sometimes hinders | understanding them. | | A different approach would be to instead normalize all words to a | certain fixed width. So, "to_add" and "to_remove" would have the | same virtual width. | | A related issue is that leading indentation counts towards the | width limit. This causes refactorings which simply move code | around (changing its indentation level) to change the code's | shape, even when the code hasn't otherwise changed. This is | exacerbated by that one often needs to mold code in such a way | that Black formats it in an agreeable way, but this is generally | not done during refactorings, so the readability of the code | suffers. | | I had the opportunity to write a formatter (for SQL, also | unconfigurable/opinionated); it seems to successfully avoid these | problems: https://github.com/CyberShadow/squelch | ed25519FUUU wrote: | I use black and love it-- but only with 120 line lengths. The | default of 80 is wayyy to low for the days of 4k monitors. The | tricks it uses to split some things up onto new lines actually | makes it less readable. | megapolitics wrote: | I agree. I've sometimes found Black's output to be on the | borderline of unreadable with the default line length of 80. My | team settled on a length of 120 (the only Black config item we | changed) and it has largely, though not entirely, solved that | problem. | ambivalence wrote: | As long as you can easily review code side-by-side with line | numbers intact, you're good. The default was chosen for lower | resolution 13" laptop monitors to be able to display the | Phabricator diff page (think: Github PR review page) without | having to wrap any lines. | faut_reflechir wrote: | I don't love how Black doesn't let you put some clarificatory | parentheses -- for instance, they get wiped from `eq_balanced = | (left_hand_side == right_hand_side)` But the benefits of never | wasting time on discussing inanity outweigh any specific | complaints. | rsfern wrote: | You can disable formatting for specific lines or blocks with `# | fmt: off` | | https://black.readthedocs.io/en/stable/the_black_code_style/... | rr808 wrote: | Anyone have a foolproof way to reformatting all the code in a | repo without screwing up history? I've seen some complicated | commands which seem too sketchy to a git novice like myself. | mumblemumble wrote: | Do it all in one commit. | | Then put that commit's (full) sha in a file named something | like .git-blame-ignore-revs | | Then `$ git config blame.ignoreRevsFile .git-blame-ignore-revs` | rr808 wrote: | Thanks, that is helpful, esp I can google that to get more | docs. One issue is everyone in the team needs to do so, but | its probably worth it. | dang wrote: | Past related threads: | | _Black - Uncompromising Python code formatter_ - | https://news.ycombinator.com/item?id=19939806 - May 2019 (244 | comments) | | _Linting 400kLOC of Python Code with Black_ - | https://news.ycombinator.com/item?id=18536731 - Nov 2018 (1 | comment) | | _Black: An uncompromising Python code formatter_ - | https://news.ycombinator.com/item?id=17151813 - May 2018 (255 | comments) | woodruffw wrote: | Congratulations to the Black authors! It's a wonderful tool, | probably the first one I install when creating a local Python | development environment. | faangiq wrote: | Is there an equivalent for TS/JS? How about Java? | iddan wrote: | Check out Prettier | _old_dude_ wrote: | prettier [1] and google-java-format [2] | | [1] https://prettier.io/ [2] https://github.com/google/google- | java-format | lelandfe wrote: | "Standard" was popular for a while but fell out of vogue. | Prettier is the one to reach for these days. I'm a big fan | simonw wrote: | Prettier is the closest I've found for JavaScript. | simonw wrote: | Adopting Black made me realize quite how much of my coding | thinking capacity had previously been spent thinking about code | formatting - I used to really sweat the details about how to | break up a long function call, where to put the line breaks, how | to indent my dictionary literals... | | With Black, I don't spend a single moment thinking about that at | all. I estimate I've got a 5-10% productivity boost in my time- | spent-writing-code from this! | eawoifjaiowepfj wrote: | It's been at least a decade since I've not used an | autoformatter on every piece of code ever. I didn't realize | there were people who worked at places without autoformatters | still. | npage97 wrote: | To add onto this, I also found that Black works as a nice | heuristic indicating to split up code when the formatted output | isn't "pretty" into separate lines. | ublaze wrote: | I remember we migrated 2+ million LoC to being formatted by Black | at Dropbox. | | Our Livegrep instance with a custom Git blame implementation | always crashed at the commit made to do the migration :-) We had | to pause our merge queue because we didn't want to run into | conflicts, and I remember the `git push` ended up taking a while. | | There was only one change that we had to make to Black to get it | working on our codebase - | https://github.com/psf/black/commit/024c9cab55da7bd3236fd887... | | Glad to see it's now stable. | skrause wrote: | When I switched the company to Black, I reformatted the whole | repository history with it. Every developer had to clone the | repository again and reapply their local changes to it, but in | the end it was a good choice because "blame" still works | perfectly since we don't have one big reformatting commit. | glacials wrote: | An alternative is to use Git's blame.ignoreRevsFile[1] option | to ignore specific commits when calculating blames. The | downside is that although you can save the list of commits in | the repo, you cannot do the same for the config setting | itself, so it calls for some light automation at scale. | | [1]: https://git-scm.com/docs/git-blame#Documentation/git- | blame.t... | Operyl wrote: | `another_really_really_long_element_with_a_unnecessarily_long_n | ame_to_describe_what_it_does_enterprise_style` hahahahaha, I | love that test case. | ublaze wrote: | To clarify, the slow git push was likely custom pre-receive | hooks being slow. ___________________________________________________________________ (page generated 2022-01-29 23:00 UTC)