Also, do y’all call main() in the if block or do you just put the code you want to run in the if block?

    • Eager Eagle@lemmy.world
      link
      fedilink
      English
      arrow-up
      25
      ·
      edit-2
      9 days ago

      I work in an academic / research environment. Depending who wrote it, even seeing a __name__ == "__main__" is a bit of a rare thing…

      • SpaceNoodle@lemmy.world
        link
        fedilink
        arrow-up
        17
        ·
        9 days ago

        Academic code is absolutely horrific.

        Fortunately, it is possible to translate it for practical applications.

      • ℍ𝕂-𝟞𝟝@sopuli.xyz
        link
        fedilink
        English
        arrow-up
        12
        ·
        9 days ago

        Do you also have nothing but love for those 50+ cell Jupyter notebooks that don’t use a single function and have everything in the global scope?

        • Eager Eagle@lemmy.world
          link
          fedilink
          English
          arrow-up
          9
          ·
          9 days ago

          the best thing is when not even the author knows the correct order of running the cells; because of course it isn’t top-to-bottom.

          • ℍ𝕂-𝟞𝟝@sopuli.xyz
            link
            fedilink
            English
            arrow-up
            8
            ·
            9 days ago

            Yeah, and also zero dependency management, so you are free to figure out what combination of Python, Tensorflow and Keras will make it not throw random exceptions.

            And don’t forget the number one rule: you must use all the graphing libraries, all the time.

      • brian@programming.dev
        link
        fedilink
        arrow-up
        4
        ·
        9 days ago

        python isn’t the only language to do “execute everything imported from a particular file and all top level statements get run”. both node and c# (but with restrictions on where top level statements can be) can do that type of thing, I’m sure there’s more.

        python conventions are unique because they attempt to make their entrypoint also importable itself without side effects. almost no one needs to do that, and I imagine the convention leaked out from the few people that did since it doesn’t hurt either.

        for instance in node this is the equivalent, even though I’ve never seen someone try before:

        if (path.resolve(url.fileURLToPath(import.meta.url)).includes(path.resolve(process.argv[1])))
        {
          // main things
        }
        
    • wise_pancake@lemmy.ca
      link
      fedilink
      arrow-up
      14
      arrow-down
      1
      ·
      9 days ago

      Why would you waste a function call on something so completely redundant?

      ~For real though, arg parsing goes in the if, then gets dispatched to whatever function call is needed to run the proper script.~

    • NeatNit@discuss.tchncs.de
      link
      fedilink
      arrow-up
      10
      ·
      9 days ago

      I definitely do for quick scripts, but I try to break this habit. The biggest advantage of def main() is that variables are local and not accessible to other functions defined in the same script, which can sometimes help catch bugs or typos.

    • LeninOnAPrayer@lemm.ee
      link
      fedilink
      English
      arrow-up
      7
      ·
      edit-2
      9 days ago

      If the file is just a class I usually put example usage with some default arguments in that block by itself. There is no reason for a “main” function. It’s a nice obvious block that doesn’t run when someone imports the class but if they’re looking at the class there is a really obvious place to see the class usage. No confusion about what “main()” is meant to do.

      if __name__ == '__main__':
          # MyClass example Usage
          my_object = MyClass()
          my_object.my_method()