在cpython中扩展模块字典以返回任意命名的对象

发布于 2024-12-08 13:18:05 字数 751 浏览 1 评论 0原文

我的任务是为我们的建模软件实现一个 Python 接口。 我很抱歉,但这是我第一次接触 python,所以这是一个缓慢的过程。 我一直在 CPython 中工作,

这是我的问题。 如果用户输入:

a = model_123456(例如), 我希望它返回相应的对象。 问题是这些对象是在软件中动态创建的。

我不想用潜在的数千个这样的对象填充 globals() 字典, 如果它们从未被访问过。

我不想将其实现为方法,例如:a = getmodel(123456) 因为我们力求简洁,通过成员属性而不是方法进行大多数访问。

我一直在研究不同的解决方案,但似乎没有一个完全适用或明确(例如“模块上的 gettr”)

认为我需要做的是在我的顶级模块中创建一个字典,从我可以重写 getitem 方法吗?

如果是这样的话,我很难弄清楚如何在 CPython 中做到这一点。

例如:m = PyModule_Create(&tdmodule)
问题 1:这已经返回一个设置了 tp_dict 的对象。 否则我将如何设置/覆盖这个插槽?

问题 2:如何在 CPython 中重写 PyDict 对象的 getitem 函数(或创建具有类似属性的字典)? 我是否需要使用自定义映射 getsubscript 方法创建字典,或者我可以简单地在 setitem 上 setattr 吗?

如果这个问题听起来很困惑并且做出了很多错误的假设,我再次表示歉意,它可能是这样。

感谢您的任何澄清, 抢。

Ive been tasked with implementing a python interface to our modelling software.
I apologize but this is my first exposure to python, so its a slow process.
Ive been working in CPython

Here's my problem.
If a user types:

a = model_123456 (for example),
I would like it to return the corresponding object.
The problem is these objects are dynamically created in the software.

I do not want to populate the globals() dict with potentially thousands of these objects,
if they're never accessed.

I do not want to implement it as a method eg: a = getmodel(123456)
as we are striving for brevity, making most access through member attributes, not methods.

I've been investigating different solutions but none quite seem to be applicable or clear (eg "gettr on a module")

I think what I need to do is create a dictionary in my top level module, from which I can override the getitem method?

If thats the case, Im having trouble figuring out how to do this in CPython.

eg: m = PyModule_Create(&tdmodule)
Question 1: This already returns an object with tp_dict set.
How would I set/override this slot otherwise?

Question 2: How do I override the getitem function of a PyDict object in CPython (or create a dictionary with that similar attribute)?
Do I need to create a dictionary with a custom Mapping getsubscript method, or can I simply setattr on setitem?

Again my apologies if this question sounds confused and making lots of bad assumptions, it probably is.

Thanks for any clarification,
Rob.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文