• AeroLemming@lemm.ee
    link
    fedilink
    English
    arrow-up
    26
    ·
    3 months ago

    I don’t understand why people complain about their Python code breaking because it relies on indentation instead of explicit {} syntax. I’ve never had an issue with it and it’s not just because I’m used to it because Python is the only language I use that relies on whitespace like that. I think the complainers just don’t know how to indent properly, which makes me really glad they’re writing in a language that forces them to instead of pushing unreadable garbage in other languages.

    • Ephera@lemmy.ml
      link
      fedilink
      arrow-up
      10
      ·
      3 months ago

      I mainly found it annoying while writing code, because the lack of braces makes it difficult to tell when a scope ends. Plenty times, I’ve wanted to add something to the end of a for-loop, but had too little indentation.
      Usually this means I get a runtime error, because it can’t access some variable from the loop-scope. But worst case, it only executes once after the loop and I don’t notice the problem.

      Another big thing I miss when not having explicit braces, is opening up new/anonymous scopes to isolate variables, which helps prevent mistakes down the line + reduces code complexity.

      For example, this is a thing I do quite regularly:

      let client = {
          let client = new Client()
      
          let timeout = config.load("client.timeout")
          client.set_timeout(timeout)
      
          client //implicit return value of this scope when evaluated as an expression
      }
      
      client.request_something()
      

      It allows me to visually group the initialization code for the client and I don’t need to have the timeout variable in scope afterwards. Depending on the language, you can also have the client variable mutable inside the scope and then immutable outside.

      Yes, this could be pulled out as a function to achieve something similar, but in my experience people (including me) will often just not do that, because it’s only the timeout variable or whatever.

      • AeroLemming@lemm.ee
        link
        fedilink
        English
        arrow-up
        3
        ·
        edit-2
        3 months ago

        I can see why you’d prefer braces in that case. I actually personally prefer {} over indentation as a matter of opinion, I just see them both as working fine 99% of the time. I’d also definitely take indentation over some shenanigans like start/end to define scopes.

      • Kache@lemm.ee
        link
        fedilink
        arrow-up
        1
        ·
        3 months ago

        wanted to add something to the end of a for-loop, but had too little indentation

        To address this, I prefer reducing length & depth of nested code, so the for/while is rarely ever not visible along with everything inside it. Others have success with editors that draw indentation lines.

        opening up new/anonymous scopes

        I occasionally use Python nested functions for this purpose

    • linkhidalgogato@lemmy.ml
      link
      fedilink
      arrow-up
      7
      ·
      3 months ago

      its just not as clear especially when u are indenting stuff inside stuff with a bunch of conditions everywhere its hard to read just from indentation, and with the () or {} u can just click on it and most text editors will show u from where to where its going.

      • zalgotext@sh.itjust.works
        link
        fedilink
        arrow-up
        11
        ·
        3 months ago

        especially when u are indenting stuff inside stuff with a bunch of conditions everywhere

        That’s an anti pattern in basically every language though. The fix is to simplify those conditionals, not use a curly-bracketed language.

    • tyler@programming.dev
      link
      fedilink
      arrow-up
      3
      ·
      3 months ago

      Try finding a bug related to indentation in a 15 year old python codebase by the worst programmers on the planet. You won’t think that there’s no issues with it after that point. In any other language you literally just reformat and you’ll see the bug. That’s not the case in Python.

    • h0bbl3s@lemmy.world
      link
      fedilink
      arrow-up
      3
      ·
      3 months ago

      I’ve been coding around 25 years and got my start in perl. I absolutely hated python when I first used it. I use it all the time now. I still prefer my curly braces but I don’t have any trouble with python or mind the whitespace anymore. I just run it through ruff every save. I do the same with go everything goes through gofumpt. I really think a lot of it is a generational thing. Older people are just used to curly brackets.

      I do get peoples complaints about the packaging. Unless you’re a dev already it’s a bit extra to deal with shuffling virtual environments because the system python environments almost never work out of the box, at least in the last few distros I’ve used. Once I adjusted though it’s no problem. I run half my dev stuff in toolboxes with their own environment anyway.

    • uranibaba@lemmy.world
      link
      fedilink
      arrow-up
      3
      ·
      3 months ago

      I once wrote a bot in python tdownloaded a ical file, looked for chances and informed me if found. The space indentation made it hell to follow the code in my opinion.

      • naught@sh.itjust.works
        link
        fedilink
        arrow-up
        6
        ·
        edit-2
        3 months ago

        Just curious, what about spaces made it hard? What language would have been easier? In curly brace languages, 99% of the time, a curly brace is followed by a line break and an indent. Python is similar except it’s typically a colon, line break, then indent.

        What I have learned is: If the code is indented too deeply, it’s a code problem, not the language.

        Torvalds infamously wrote:

        “… if you need more than 3 levels of indentation, you’re screwed anyway, and should fix your program.”

        • uranibaba@lemmy.world
          link
          fedilink
          arrow-up
          2
          ·
          3 months ago

          Too much nested code was likely part of the problem, but not being able to easily tell where a block of coded ended without seeing the top of the block made it difficult to work with.

          • naught@sh.itjust.works
            link
            fedilink
            arrow-up
            2
            ·
            3 months ago

            That’s fair! Takes time to get used to. Modern editors make this easier by highlighting the current indent level, or can even make the top X lines of the current closure “stick” to the top of the editor for those really long blocks.

            • uranibaba@lemmy.world
              link
              fedilink
              arrow-up
              2
              ·
              3 months ago

              Having those features would really have made it easier. I have only ever written my python code in Sublime Text. While it is a sublime text editor, at is not ideal (compared to how it is to write Java in IntelliJ) for Python. (Maybe with addons but I never delved into that more than a few.)

        • Ephera@lemmy.ml
          link
          fedilink
          arrow-up
          2
          ·
          3 months ago

          Torvalds wrote this about C. There’s plenty languages where it’s much more common and less of a complexity indicator to open up scopes.

          • naught@sh.itjust.works
            link
            fedilink
            arrow-up
            6
            ·
            3 months ago

            Correct, I linked the source of the quote. My implication is the general idea is applicable here. Is python one of these languages where it is idiomatic to nest code deeply?

            The Zen of Python:

            Flat is better than nested.

            From the python I have seen and written, deep nesting is avoided.

      • Jeena@piefed.jeena.netOP
        link
        fedilink
        arrow-up
        1
        ·
        3 months ago

        I don’t get it because my phyton code is indented exactly the same as all my other code. Each block of code one tab in/out, how else would you do it?

        • uranibaba@lemmy.world
          link
          fedilink
          arrow-up
          1
          ·
          3 months ago

          It’s because there is no clear indication of where a block ends.

          Here is some sample code. I find it difficult to tell how many indentations I have or where I need to write if I want to continue at a certain level.

          import time
          import aiohttp
          
          """
          Retreives the data from RSS URL and return the status codes as well as the data. Return -1 if something went wrong.
          """
          async def get_rss_feed(rss_url):
              async with aiohttp.ClientSession() as session:
                  try:
                      retry_count = 0
                      while retry_count < 5:
                          async with session.get(rss_url) as resp:
                              if resp.status == 200:
                                  return {'status': resp.status, 'data': await resp.text()}
                              else:
                                  retry_count += 1
                                  time.sleep(60)
                      if retry_count == 5:
                          raise ValueError('To many failed connection attempts', retry_count)
                  except aiohttp.InvalidURL as error:
                      return {'status': -1, 'data': f"Error: {rss_url} is not a valid URL.", 'error': error}
                  except aiohttp.ClientConnectorError as error:
                      return {'status': -1, 'data': f"Error: Could not connect to {rss_url}.", 'error': error}
                  except ValueError as error:
                      return {'status': -1, 'data': f"Error: Could not connect to {rss_url} after {retry_count} attempts.", 'error': error}
          
    • lud@lemm.ee
      link
      fedilink
      arrow-up
      2
      ·
      3 months ago

      I have never had any problems with it either but don’t get me started on YAML.