-
-
Notifications
You must be signed in to change notification settings - Fork 31.9k
PyCapsule_Import fails when name is in the form 'package.module.capsule' #76595
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
When capsule name is in the form 'package.module.capsule', PyCapsule_Import fails with an AttributeError (module is never an attribute of package). |
PR 4988 will break the case 'module.attr.capsule' if 'module.attr' is not a module. |
|
thinking out loud here: maybe both behavior can be exposed, i.e. a PyCapsule_Import that would expect a valid import statement and a Py_GetCapsule that would behave more like getattr? |
An option would be to use a colon to separate the module(s) from the attribute(s). The "inspect" module CLI does this, for example: $ python3 -m inspect urllib.parse:SplitResult.geturl
def geturl(self):
return urlunsplit(self) A colon can't appear in an identifier, so the old way can be used if there's no colon in the argument, making this backwards compatible. |
"package.module:attribute" is also the syntax used in packaging tools to unambiguously separate the name of the module to be imported from the attribute chain to be looked up within that module: https://packaging.python.org/specifications/entry-points/ So +1 from me for extending it to this use case as well. |
+1 on using ":" as the separator. |
Using ":" makes the syntax irregular. "package.module:attribute", but "module.attribute". And "package.module.attribute" works too if "package.module" already is imported. It is possible to support importing submodules without using ":". |
I'm sorry if this interrupts the discussion, but isn't this https://github.com/plures/xnd/blob/06f6dd82dda9c7bca5df30b121b5cd75c6337609/python/xnd/pyxnd.h#L103 of the form package.module.capsule? This works, and I just want to make sure it continues to do so. |
Ah, Serhiy stated the reason (module already imported) previously. Sorry for the noise. |
In your case importing xnd automatically imports xnd._xnd and sets it as an attribute of xnd. This case works now. PR 6898 adds support for cases when a submodule is not imported automatically by importing a package. |
Is "package.module:namespace.attribute" worth supporting? I guess it isn't, at least for now. So Serhyi's patch will work. |
The behaviour I'd expect to see: "module:qual.name" -> "imports module, accesses module.qual.name" So if you have ":" in the capsule path, you're requesting that the interpreter execute an import with the path up to that point before attempting to resolve the full name reference. By contrast, if you omit the ":", you're telling the interpreter that you'll take care of ensuring that any required imports have taken place before attempting to resolve the capsule reference. |
This change would break virtually all existing usages of PyCapsule_Import(). And it would look very surprising taking into account the name of this function. Currently "package.submodule.qual.name" imports package and accesses package.submodule.qual.name. You are out of luck if package.submodule was not imported before or if importing package doesn't import package.submodule. |
Ah, sorry, I misinterpreted Petr's comment, and then didn't look at the details of your PR before commenting. Having fixed that mistake, I agree that making the naive approach "just work" is a good option. |
There's a PR (pythonGH-6898) which changes this behavior (to be less surprising, I believe), but this seems to have stalled. See: python#76595 See: python#6898
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
Linked PRs
PyCapsule_Import
behavior #134022The text was updated successfully, but these errors were encountered: