[PyQt] Unable to weakreference pyqtBoundSignal
Phil Thompson
phil at riverbankcomputing.com
Mon Oct 9 18:11:58 BST 2017
On 29 Sep 2017, at 1:57 pm, Kyle Altendorf <sda at fstab.net> wrote:
> On 2017-09-29 04:58, Phil Thompson wrote:
>> On 29 Sep 2017, at 4:22 am, Kyle Altendorf <sda at fstab.net> wrote:
>>> TypeError: cannot create weak reference to 'PyQt5.QtCore.pyqtBoundSignal' object
>>> Are pyqtBoundSignals intentionally not weak referenceable? If not, could it be?
>>> Example and output:
>>> https://gist.github.com/altendky/9f942709dfc2f33019723ffff43260b1
>>> Since I already had it open:
>>> https://docs.python.org/3/extending/newtypes.html#weakref-support
>> They aren't because I don't really see the point. Bound signals only
>> exist during the period of an emit(), connect() or disconnect().
>> Having said that, bound methods are weak referenceable.
>
> My use case was that I am creating functions dynamically to connect as slots and
> wanted hold the signal/slot pairs in a WeakKeyDictionary I could later use to
> disconnect them. Instead I just apply the same logic to get the same signals
> again to disconnect. Using the slot as a weak key just seemed a bit more direct.
>
> But perhaps I am misunderstanding something. You say the the bound signal only
> exists _during_ an emit/connect/disconnect? I'm not sure what's going on there.
> I explored a little but didn't find anything enlightening. The id() of the signal
> is the same when accessed repeatedly and inspect.is{data,method,member}descriptor()
> all return False in my checks.
>
> https://gist.github.com/altendky/7096674b424af3ed8d80e47a41af3169
>
> If you have time to explain a little I would be interested to learn.
You are (perhaps understandably) misreading the str() of a bound signal. The address embedded in the string is the id() of the bound object (ie. id(o)). If you print the id() of a and b you will see they are different.
Regarding inspect, *unbound* signals are descriptors, not bound ones.
Phil
More information about the PyQt
mailing list