GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GeezerVison is showing github.com — bpo-11063, bpo-20519: avoid ctypes and improve import time for uuid by pitrou · Pull Request #3796 · python/cpython Conversation
|
|
Please add a NEWS entry. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
The potential issue here is that the uuid headers are not always installed (for example they aren't on the Travis-CI machine, even though it has many development headers installed). |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| PyMODINIT_FUNC | ||
| PyInit__uuid(void) | ||
| { | ||
| assert(sizeof(uuid_t) == 16); |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
You might use Py_BUILD_ASSERT() to run the check at the compilation.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Is sizeof() allowed in macros? Usually we have SIZEOF_* for that.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
I don't know. In case of doubt, keep your assert(), it's fine.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
|
||
|
|
||
| static PyObject * | ||
| _uuid_generate_time_safe(void) |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
I suggest to add a py prefix: py_uuid_generate_time_safe().
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Agreed.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| NULL, | ||
| -1, | ||
| uuid_methods, | ||
| NULL, |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Maybe remove trailing "NULL,". The compiler set them to 0 / NULL anyway.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Yup.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| "_uuid", | ||
| NULL, | ||
| -1, | ||
| uuid_methods, |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Can you use C99 style here to avoid surprising/boring "NULL," members?
.m_name = "_uuid",
.m_size = -1,
.m_methods = uuid_methods,
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Oh, great, I'll do that.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| else: | ||
| def _generate_time_safe(): | ||
| return _uuid.generate_time_safe() | ||
| _has_uuid_generate_time_safe = True |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Why not just _generate_time_safe = _uuid.generate_time_safe?
I would prefer an explicit "return" here.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Hmm, ok.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
|
||
| @unittest.skipUnless(c_uuid, 'requires the C _uuid module') | ||
| class TestInternalsWithExtModule(BaseTestInternals, unittest.TestCase): | ||
| uuid = c_uuid |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
I don't see the point of testing all uuid.*getnode() functions with and without _uuid. Basically, it's the same test run twice, no?
Only getnode() and uuid1() should be tested with and without _uuid, no?
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Only getnode() and uuid1() should be tested with and without _uuid, no?
Probably. I didn't want to modify the tests too much but I'll take a look.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
I've changed my mind: I think all tests should be run both with and without the C _uuid extension module. It doesn't cost much to do so, and it's more future-proof.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated. Once you have made the requested changes, please leave a comment on this pull request containing the phrase |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
@pitrou: "The potential issue here is that the uuid headers are not always installed (for example they aren't on the Travis-CI machine, even though it has many development headers installed)." That's fine. We have buildbots for further tests. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
@Haypo, I think I've addressed your comments. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Ah, the new PR now looks better! I hope that it's my last round of minor comments :-)
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| PyModuleDef_HEAD_INIT, | ||
| .m_name = "_uuid", | ||
| .m_size = -1, | ||
| .m_methods = uuid_methods, |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Oh, I really like this syntax. We should use it more often!
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
|
||
| # Build the _uuid module if possible | ||
| build_uuid = False | ||
| if find_file("uuid.h", inc_dirs, ["/usr/include/uuid"]): |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Since you add /usr/include/uuid to inc_dirs, I would maybe store find_file() result into uuid_incdirs and then pass it to Extension(): inc_dirs=uuid_incdirs? Similar code is used for ssl_incs.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Ok.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| # Build the _uuid module if possible | ||
| build_uuid = False | ||
| if find_file("uuid.h", inc_dirs, ["/usr/include/uuid"]): | ||
| if self.compiler.find_library_file(lib_dirs, 'uuid'): |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
You may also store the result of find_library_file() into uuid_libdirs to pass it to Extension library_dirs. I'm not sure about this one.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Let me try...
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
No, it shouldn't be necessary. Other uses of find_library_file() don't do it.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Ok, fine.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
|
||
| class TestUUID(unittest.TestCase): | ||
| class BaseTestUUID: | ||
|
|
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Please add "uuid = None" here.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| uuid = c_uuid | ||
|
|
||
|
|
||
| class BaseTestInternals: |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Please add "uuid = None" here.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| continue | ||
| # Try to find the safe variety first. | ||
| if hasattr(lib, 'uuid_generate_time_safe'): | ||
| _uuid_generate_time = lib.uuid_generate_time_safe |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Would you mind to rename "_uuid_generate_time" to "_uuid_generate_time_safe"? I was confused while reading the code.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Oh, sure.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| if _has_uuid_generate_time_safe is not None: | ||
| return | ||
|
|
||
| _has_uuid_generate_time_safe = False |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure of the value of _has_uuid_generate_time_safe. The exact value (True or False) is not use. Maybe rename the flag to _system_functions_initialized or something like that, and only use False/True values?
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
It's used in the tests.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Oh, I didn't notice. In this case, it's fine. I was just surprised to see 3 states where only 2 states are used in uuid.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
I hacked the code to disable _uuid, uuid_generate_time_safe and uuid_generate_time in uuid.py. With these changes, tests fail: Python 3.6 test contains: |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
You're right, I'm gonna reinstate the |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
LGTM as soon as you fix the test failure I reported in my latest comment.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
Is it possible to get this back-ported into (i guess, at least) 3.6? |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
No, sorry, it's not possible. The change is too big to be qualified as a
bugfix. For me, it's a new feature and so cannot be backported. The risk of
regression is too high.
The best you can do is to write a 3rd party extension on PyPI to backport
the module to 3.6 and maybe older (2.7??).
|
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
Successfully merging this pull request may close these issues.
There was an error while loading. Please reload this page.