PyCQA / pycodestyle

Simple Python style checker in one Python file
https://pycodestyle.pycqa.org
Other
5.01k stars 755 forks source link

E122: No valid indent for long function call nested in f-string? #1242

Open anntzer opened 3 months ago

anntzer commented 3 months ago

For the following example

class T:
    def m1(self):
        print(f"""
preamble
{some_long_func(
    some_long_arg, other_long_arg, more_long_arg)}
postamble
""")

    def m2(self):
        print(f"""
preamble
{some_long_func(
     some_long_arg, other_long_arg, more_long_arg)}
postamble
""")

there appears to be no indentation of the "long args line" that makes pycodestyle not emit a E122 ("continuation line missing indentation or outdented") for that line. (If m1 and m2 are toplevel functions and not methods, then the second form makes pycodestyle happy.)

asottile commented 3 months ago

this passes, though I'm not sure it's right -- I'm inclined to just say "you're doing too much in an f-string and the linter is rightfully punishing you" (despite the probable bug) -- do the assignments to some variables outside the fstring and the code will be much easier to read and maintain anyway:

class T:
    def m1(self):
        print(f"""
preamble
{some_long_func(
            some_long_arg, other_long_arg, more_long_arg)}
postamble
""")

    def m2(self):
        print(f"""
preamble
{some_long_func(
            some_long_arg, other_long_arg, more_long_arg)}
postamble
""")
anntzer commented 3 months ago

Ah, I didn't think of trying to indent all the way up to the indent defined by outside the f-string. I would still say it is a bug (I think the reasonable indent would be 4 (or 5) spaces from the left, i.e. including the opening brace or not, but I leave it up to you as to whether this is something you want to fix or just to close. Alternatively, another solution would be to just accept all indents inside a multiline f-string, because I don't think there's actually any clear style guidelines about that (well, possibly except "don't have substitutions so long that they must be split over multiple lines"... which could possibly be its own style check).