5 ms·
The code is not garbage, it's just your highfalutin python opinion makes it so you only ever use list comprehensions or return generators. For loops in python
by byby 3y ago
The code is not garbage, it's just your highfalutin python opinion makes it so you only ever use list comprehensions or return generators.
For loops in python that return non lazy evaluated lists are fine. Python was never suppose to be an efficient language anyways, grading python based off of this criteria is pointless.
It doesn't matter how snobbish you are on language syntax though. I fed it code and regardless of whether you think it's garbage it did what I asked it to do and nothing else.
Would you prefer the AI say, "this code is garbage, here's not only how to make it unit testable but how to improve your garbage code." Actually we can make the output more unpredictable as LLMs do have a non deterministic seed that can increase the creativity of the answer.
- Marazan 3y agoIt has wrapped range() with useless code. It has added no functionality, it has not improved testability in any way. . Please, take the code it has produced and integrate it into the original function. All it does is replace the range call. That's it. It has absolutely and totally failed at the given task whilst outputting plausible garbage about why it has succeeded.
- moomoo3000 3y agoIt removed the print and returns a list instead.
- Marazan 3y agoWhich is useless because _it has changed the semantics of the function_
- moomoo3000 3y agoIt was a bad function
- byby 3y agoYou have to change the semantics of the function to make it unit testable. Literally tell me how else can you test that function with a unit test? By definition a unit test can only test functions that return data. So there's no other option here.
- Marazan 3y agoLet me tell you your mind is going to be blown once you learn about Monads. A mutable object is functionally identical to a return value if you control the initial state and lifetime of the object. Like you can do in a unit test. And as I demonstrated in my other comment I 100% retained the semantic structure of the function whilst making it 100% unit testable.
- byby 3y agoI think you don't understand what unit testability means. It means removing IO and side effects from your code. How the hell do I test a print function? I take the print function and match it with what? It has no output so how can I test it printed the correct thing? I can't. I can test a list. I just match it with another list. Making your code unit testable is about segregating IO from logic. Write pure logic where all functions have inputs and outputs and those things can be tested. Your io prints should be small because all functions that do io cannot be fully tested. IO is pollution. Any output to IO is the program exiting the logical mathematical universe of the program and that output can be verified only by an external entity. Either your eyes for stdout or another process or files or a bunch of other ways. Unit tests are about internal local tests that touch local functionality and logic. If you want something unit testable it needs a local output and an input and it shouldn't rely on io in it's data path. I think your complaint here is an example of chatGPT superiority. It understood something you didn't. Well now you know. Removing the print function from the logic and returning the data is 100 percent the correct move. Do you understand?
- Marazan 3y agoblink Of course you can make the function with a print statement more unit testable without completely changing it's semantics! You pass in an outputstream and use that as the target for print. Then your unit test can create its own stream and test the content of the stream whilst production code can pass in standard out. That way you don't completely change the semantic meaning of the code. And once again that GPT function is useless. It is identical to list(range()) and it doesn't do what the first function does. Anyone can make anything more unit testable if it doesn't have to do the same thing.
- byby 3y agoBro, dependency injection and mocking is the same thing as segregating your function from IO. Your replacing io calls to stdout with io calls to something else. But that doesn't make your code unit testable. The function is still touching io. You gonna test it with another function that touches io? That defeats the point of the definition of unit testability. > and doesn't do what the first function does. Are you serious? You mock your output streams with hacky monkey patching your function ALSO stops doing what it originally does. It's essentially black magic globals that mutate your program... very bad practice. Chatgpt here just didn't write the obvious io component of the code because it would be freaking pedantic. The full code would include a function that prints lists composed with a function that produces lists. The composition allows part of the program to be testable while leaving the io part of it not testable. For the original program NONE of it was testable. Your Monkey patching here would be replaced by different io functions. You want to change the output stream? then you change the IO function. Compose the list producer with another IO function. Play type Tetris and you can recompose your list producing function with all kinds of modular io. The point it you separated the core logic away from IO thereby making it more modular and more testable. None of the io functions are testable via unit tests, that is the point. That is the definition of the most basic form of testing... Unit tests. You literally HAVE to change your code in order to make it unit testable. If your code is throwing shit to io and retrieving values from io then none of your code is unit testable. You're at the integration test level and at this level things become hacky and more complicated. Your tests not have external dependencies like state, the operating system and you have to run hacks like your monkey patch. Where ever you work or whatever you've been doing if you haven't been doing what I described then you (and your work buddies) haven't been testing your code via unit tests. That's fine, whatever works bro. But chatGPT knows the common parlance for testing and unit testing, and it did exactly the correct thing. Your interpretation of what testing is the thing that is strange and off here.