Conversation
…read functions accepting FileLike incorrectly.
|
hi @nachomaiz thanks a lot! I am a bit snowed right now, but will take a look as soon as I get some time.
@jonathon-love please check this PR, probably it addresses the same as in yours? |
|
Thank you for the feedback! I've now changed I also took a quick look at @jonathon-love's PR, and I realized I was missing specific types for I switched the dataframe types for the write functions to Additionally, I've added |
|
hi @nachomaiz thanks for your efforts! I have cloned your fork, compiled it (all ok) and then run the tests. The test_basic.py and test_narwhalified.py fail with 3 errors. The origin is probably that in the metadata _container class, if you look carefully, there are some members like number_rows that before were by default None, and now you are defining them as 0, this raises an inconsistency when using metadataonly, which also breaks read_in_chunks when reading an export file. So, could you please review those members and adapt them to be as they were before? oh now I see your comment No, that is not correct, those values are not always set and therefore the None's need to be there, also do not default datetime.now but to None. Another one: typing_test.py raises a lot of errors. I am less familiar with mypy so I have not checked what they are about. I think you have to get a machine where you can compile pyreadstat and be able to run the tests, please run test_basic.py, test_narwhalified.py with backend==pandas and backend==polars and test_http_integratio.py. BTW,please rename typing_test.py to test_typing.py just to keep the naming pattern. Last one: I think this might be unnecessary if you included py.typed in the manifest. The issue with package data, is that on windows, when people install Python from the window app market store, it installs the package and package data into different places (can't remember exactly), and I am not sure if in such case the IDE will see the py.typed (maybe yes?). I had such an issue in the past when I had to deliver dll files for windows, and python was not able to find them. I think this has to be tested. Otherwise it looks good! =) Speed is also the same as before when I converted the files from pyx to py, so it seems the dataclass change is neutral in terms of performance. |
|
Hello! Thank you for reviewing and for your feedback! I'm working on setting up a machine to be able to compile and run tests, will hopefully have it soon. In the meantime, just wanted to get your thoughts on a couple of the things you mentioned above. I have now gone through the code a bit more carefully and found the places where the What makes it a bit complicated in my view is that if we set if meta.number_rows is not None:
...Which may be the easier way to handle things in the end, but also feels redundant when for many users it would never be ... On the There are a few rows which should error, there should be 5 errors in that file (there are comments in the file where it points them out). It also analyzes other files as the test file imports them, so I'm ignoring those files for the purpose of these annotations. I noticed that there's an import error in the file so at the moment it doesn't work correctly, I'll fix that soon. I should also mention that both I'll fix those few bits and remove the extra |
|
hi @nachomaiz Regarding the topic of num_rows being int or None, None signals that it was not possible to recover the information from the metadata and therefore it is undefined. It is not correct to say that happens only for POR and XPORT files, theoretically can happen to any file type if the writing application did not write that information, for example in the case of SPSS SAV files, some applications do not write the number of rows and therefore cannot be determined and should stay as None (see for example #109). However, I am not 100% sure of what the problem is ... this is the way it has been for years and there has been no problems so far. I am also reluctant to change the interface unless it is strictly necessary. So can you please explain a bit more what your concern is? If you mean the user needs to check the possibility that num_rows is None, yes, the user should do that if wants to be strict, no way around that, for the reason explained before. Please also notice that I would like all the members that were None before to stay as they are, not only num_rows. |
|
Ok! That makes sense. My mistake for assuming things. 😅 Will bring back all the Hopefully that gets it to a good place to merge! |
|
hi @nachomaiz thanks! Regarding the typing tests, please indicate in the comment at the top of the file, where you indicate that it has to be run with mypy, which other packages need to be installed in order to run. We need the tests to be executable, they should have assertions which should all of them pass if everything is fine and fail if something is wrong. These tests will be then run in order to make the wheels and expected to pass, so reveal_type is not enough. So please transform your tests into an executable and rename it as suggested before. I have never done this, so not sure what is better, a quick search says you can use either assert_type (would be nice as no extra package needed, then you could do similarly as test_narwhalified.py) or pytest-mypy-plugin (would require to install extra stuff, but apparently you can write negative tests more easily). |
|
Hello again! So I've managed to setup my machine to run tests! And yes I saw where they were failing. Sorry about that. I've done the following:
The typing tests are run using the following command (also available at the top of the file): pytest tests/test_typing.yml --mypy-ini-file=tests/test_mypy_setup.ini --mypy-only-local-stubThe
I've made just a few quick type tests on the Let me know if you see anything else to change! PS. I didn't go with |
Hi @ofajardo!
This PR aims to fix #299, adding type annotations to all public interface functions and classes.
I based them on the docstrings and how I understand the code is operating with the different parameters and class attributes, but I might have missed something.
I wasn't able to compile the library in this machine, however I have done a runtime check of the type annotations to make sure everything runs in py3.10+.
How it works:
TypedDictclasses for missing ranges and MR sets.FileLikeprotocol with the methodsreadandseek.os.PathLikefor flexibility withos.fsencodeWrite functions accept any dataframe object supported byWrite functions accept either anarwhals.pandas.DataFrameor apolars.DataFrameas the first argument.PyreadstatReadFunctioncallable type. It's first argument must be a path/file-like object and it must return a tuple of data and metadata.narwhalstype vars to signal the return of the same type of dataframe.While I added type annotations, I saw a few issues with the docstrings. I took the liberty to sync them up with the type annotations.
I also used a formatter for the function signatures as they were getting unwieldy. This changed the formatting of some of the code within the functions, so let me know if you would prefer I revert those.
Looking forward to your feedback.