This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2008年07月16日 19:01 by jnoller, last changed 2022年04月11日 14:56 by admin. This issue is now closed.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| add_dispatch_check-0.patch | alexandre.vassalotti, 2008年08月04日 01:44 | |||
| Messages (10) | |||
|---|---|---|---|
| msg69816 - (view) | Author: Jesse Noller (jnoller) * (Python committer) | Date: 2008年07月16日 19:01 | |
I was attempting the patch for issue3125 to py3k, and in it Amaury defines a new ForkingPickler: from pickle import Pickler class ForkingPickler(Pickler): dispatch = Pickler.dispatch.copy() This is also related to issue3350 I suspect. However, using the pickle.Pickler module under py3k, there is no dispatch() method on the class: Trunk: Python 2.6b1+ (trunk:65015M, Jul 16 2008, 10:15:51) [GCC 4.0.1 (Apple Inc. build 5465)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import pickle >>> dir(pickle.Pickler) ['_BATCHSIZE', '__doc__', '__init__', '__module__', '_batch_appends', '_batch_setitems', 'clear_memo', 'dispatch', 'dump', 'get', 'memoize', 'persistent_id', 'put', 'save', 'save_bool', 'save_dict', 'save_empty_tuple', 'save_float', 'save_global', 'save_inst', 'save_int', 'save_list', 'save_long', 'save_none', 'save_pers', 'save_reduce', 'save_string', 'save_tuple', 'save_unicode'] >>> py3k: Python 3.0b1+ (py3k:65011M, Jul 16 2008, 11:50:11) [GCC 4.0.1 (Apple Inc. build 5465)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import pickle >>> dir(Pickler) ['__class__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'bin', 'clear_memo', 'dump', 'fast', 'memo', 'persistent_id'] I think the fix for 3125 resolves your complaint in 3350, but is the lack of the dispatch method intentional? |
|||
| msg69866 - (view) | Author: Alexandre Vassalotti (alexandre.vassalotti) * (Python committer) | Date: 2008年07月17日 02:33 | |
The omission of the dispatch dictionary was sort of intentional. But now, I think it would be a good idea to add it to _pickle.Pickler. I will write a patch ASAP. |
|||
| msg70165 - (view) | Author: Alexandre Vassalotti (alexandre.vassalotti) * (Python committer) | Date: 2008年07月23日 02:12 | |
Just in case you are wondering why I haven't submitted a patch yet, I want to let you know that my home computer is currently broken. So, I won't be able to work on this until I get my computer fixed (which unfortunately could take a few weeks). |
|||
| msg70169 - (view) | Author: Amaury Forgeot d'Arc (amaury.forgeotdarc) * (Python committer) | Date: 2008年07月23日 06:44 | |
A use case: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/572213 shows how code can use the Pickler.dispatch dict, but also some Pickler.save_xxx function which should be exposed as well. |
|||
| msg70676 - (view) | Author: Alexandre Vassalotti (alexandre.vassalotti) * (Python committer) | Date: 2008年08月04日 01:44 | |
I got a preliminary patch that adds the dispatch dictionary. However, the patch leaks and it doesn't expose the save_reduce() method (which is needed by ForkingPickler). |
|||
| msg71159 - (view) | Author: Alexandre Vassalotti (alexandre.vassalotti) * (Python committer) | Date: 2008年08月15日 04:09 | |
I ran into a few problems while trying to fix this issue. First, does someone know how to add class attributes on extension types? It sounds like I will need either some tp_dict hacking or a Pickler subclass. Second, which methods of Pickler should be made public? I know save_reduce() is needed, but would it be worthwhile to expose more? In the recipe Amaury linked (which abuses Pickler IMHO), save_global(), save_dict(), write() and memoize() are used. Exposing all save_* methods is out of question for now as none were written to be used standalone. Third, should Pickler allows pickling support for built-in types (e.g., int, dict, tuple, etc) to be overridden? Currently, pickle.py allows it. However, I am not sure if it is a good idea to copy this "feature" in _pickle.c. |
|||
| msg71302 - (view) | Author: Amaury Forgeot d'Arc (amaury.forgeotdarc) * (Python committer) | Date: 2008年08月17日 23:50 | |
Maybe I missed something, but the (subclassable) python implementation of Pickler is still available with another name: from pickle import _Pickler as Pickler class ForkingPickler(Pickler): dispatch = Pickler.dispatch.copy() |
|||
| msg71394 - (view) | Author: Alexandre Vassalotti (alexandre.vassalotti) * (Python committer) | Date: 2008年08月18日 23:29 | |
Yeah, the old Pickler and Unpickler classes are available by design (to allow testing both implementation). You could subclass _Pickler as a temporary fix for this issue. |
|||
| msg108729 - (view) | Author: Alexander Belopolsky (belopolsky) * (Python committer) | Date: 2010年06月26日 15:08 | |
Do I understand correctly that the issue is that python Pickler class has dispatch attribute but C Pickler does not? The add_dispatch_check-0.patch patch does not seem to add class attribute, it adds an instance attribute instead.
I also noticed that there are many more class attributes that only Python implementation has:
>>> for x in dir(pickle._Pickler):
... if not (x.startswith('_') or hasattr(pickle.Pickler, x)):
... print(x)
...
dispatch
get
memoize
put
save
save_bool
save_bytes
save_dict
save_float
save_global
save_list
save_long
save_none
save_pers
save_reduce
save_str
save_tuple
The save_* methods are clearly internal and should probably be renamed to begin with __ unless they are intended to be overridden by Pickler subclases
|
|||
| msg108870 - (view) | Author: Alexandre Vassalotti (alexandre.vassalotti) * (Python committer) | Date: 2010年06月28日 21:16 | |
> Do I understand correctly that the issue is that python > Pickler class has dispatch attribute but C Pickler does > not? Yes. > The add_dispatch_check-0.patch patch does not seem > to add class attribute, it adds an instance attribute > instead. I know. That's why I said it was a preliminary patch. :-) Also, see msg71159 about the class vs instance attribute issue. There's a lot of code out there that do crazy things with pickle's dispatch dictionary. For now, it is best if we leave the method names alone. If people wants to keep doing their funky stuff with pickle, then we can point them to pickle._Pickler and pickle._Unpickler, which will always point to the Python implementations. That said, I do not believe it's a good idea to add the dispatch attribute to _pickle anymore. But, I acknowledge there is a need for overriding the pickling mechanism for specific types. We should find a clean way to support this. I am closing this issue as "won't fix". |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:56:36 | admin | set | github: 47635 |
| 2010年06月28日 21:16:40 | alexandre.vassalotti | set | status: open -> closed resolution: wont fix messages: + msg108870 |
| 2010年06月26日 15:08:50 | belopolsky | set | versions:
+ Python 3.2, - Python 3.0 nosy: + belopolsky messages: + msg108729 type: enhancement stage: test needed |
| 2008年08月18日 23:29:56 | alexandre.vassalotti | set | messages: + msg71394 |
| 2008年08月17日 23:50:43 | amaury.forgeotdarc | set | messages: + msg71302 |
| 2008年08月15日 04:09:38 | alexandre.vassalotti | set | messages: + msg71159 |
| 2008年08月04日 01:44:46 | alexandre.vassalotti | set | files:
+ add_dispatch_check-0.patch keywords: + patch messages: + msg70676 |
| 2008年07月23日 23:46:39 | alexandre.vassalotti | link | issue3431 superseder |
| 2008年07月23日 06:44:40 | amaury.forgeotdarc | set | messages: + msg70169 |
| 2008年07月23日 02:12:51 | alexandre.vassalotti | set | messages: + msg70165 |
| 2008年07月20日 13:44:52 | amaury.forgeotdarc | set | nosy: + amaury.forgeotdarc |
| 2008年07月17日 02:33:59 | alexandre.vassalotti | set | messages: + msg69866 |
| 2008年07月16日 19:01:36 | jnoller | create | |