473,769 Members | 4,591 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

cPickle and __getattr__

Hi all,

I have this program

class Company:
def __init__(self, revenues, costs):
self.revenues = revenues
self.costs = costs

def __getattr__(sel f, name):
if name == 'profits':
return self.revenues - self.costs

c = Company(100, 75)
print c.revenues
print c.costs
print c.profits

import cPickle
print cPickle.dumps(c )

Everything works fine up until the last line. If I remove the
__getattr__ function, then everything works (except "print c.profits").
What is the cPickle class trying to get to that is causing my
__getattr__ function to be called?

-Chris

Jul 18 '05 #1
3 1811
Chris Curvey wrote:
Hi all,

I have this program

class Company:
def __init__(self, revenues, costs):
self.revenues = revenues
self.costs = costs

def __getattr__(sel f, name):
if name == 'profits':
return self.revenues - self.costs

c = Company(100, 75)
print c.revenues
print c.costs
print c.profits

import cPickle
print cPickle.dumps(c )

Everything works fine up until the last line. If I remove the
__getattr__ function, then everything works (except "print c.profits").
What is the cPickle class trying to get to that is causing my
__getattr__ function to be called?

Potentially lots of things. But the problem isn't that cPickle is
calling __getattr__, exactly. The problem is that your __getattr__
isn't properly signalling non-existent attributes. You should raise
AttributeError instead of implicitly returning None for which there is
no attribute. Adding "raise AttributeError( name)" to the end of the
definition unbreaks it enough to let pickle work.

Jp
-Chris


Jul 18 '05 #2
>
Potentially lots of things. But the problem isn't that cPickle is
calling __getattr__, exactly. The problem is that your __getattr__
isn't properly signalling non-existent attributes. You should raise
AttributeError instead of implicitly returning None for which there is
no attribute. Adding "raise AttributeError( name)" to the end of the
definition unbreaks it enough to let pickle work.


Ah, that's it. Many thanks!

Jul 18 '05 #3
Chris Curvey wrote:
Hi all,

I have this program

class Company:
def __init__(self, revenues, costs):
self.revenues = revenues
self.costs = costs

def __getattr__(sel f, name):
if name == 'profits':
return self.revenues - self.costs

c = Company(100, 75)
print c.revenues
print c.costs
print c.profits

import cPickle
print cPickle.dumps(c )

Everything works fine up until the last line. If I remove the
__getattr__ function, then everything works (except "print c.profits").
What is the cPickle class trying to get to that is causing my
__getattr__ function to be called?

-Chris


When you use __getattr__, you should always raise an attribute error for
names that you don't handle.

def __getattr__(sel f, name):
if name == 'profits':
return self.revenues - self.costs
else:
raise AttributeError, name

Paul

Jul 18 '05 #4

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
1197
by: Richard Kessler | last post by:
I am attempting a GUI using BOA Constructor. I have some simple code to pickle an object, but for some reason when I use cPickle it hangs the system, but pickle works just fine. I do not have a clue why cPickle will not work. The code is myObj = MyObject() myObj.SetSomeProperties f = open("my file name",'w')
2
2139
by: sh | last post by:
Hi guys, Well, I have a (maybe dumb) question. I want to write my own little blog using Python (as a fairly small but doable project for myself to learn more deaply Python in a web context). I don't want so far to use a database as a backend, I'd prefer use XML which is enough for a small amount of data the blog would have to deal with.
5
2233
by: Alex Polite | last post by:
I need to put recursive data structures on disc and found out that cPickle doesn't like recursion. What are my options? alex -- Alex Polite http://polite.se
5
9453
by: Marcus Lowland | last post by:
Hello, I'm fairly new to python and have read about and wanted to begin experimenting with cpickle. As I understand, this should be a native module in the python library. I have python 2.3 and now just installed 2.4, but am not able to import or find cpickle.py in any directory of the install, or in the previous version (pickle.py is present and imports correctly). Is there a seperate module package that must be downloaded and installed......
4
2832
by: Mingus Tsai | last post by:
Hello- please help with unpickling problem: I am using Python version 2.3.4 with IDLE version 1.0.3 on a Windows XPhome system. My problem is with using cPickle to deserialize my pickled arrays of datetime.datetime instances. The following is the code I have written: import cPickle, datetime import Numeric
1
1373
by: Carl J. Van Arsdall | last post by:
Hey everyone, cPickle is raising an ImportError that I just don't quite understand. Before I paste the code, let me explain the application. Basically the part of the application that failed is a function that loads a list of objects from a file using cPickle. This list is a queue of requests. I've done some research and it looks like cPickle tries to load some modules as some kind of test. From what I can tell the module that cPickle...
8
3254
by: Jeff Poole | last post by:
This is going to be a pretty vague message because it involves a large block of code I'd rather avoid posting. Basically, I've been pickling a dictionary of instances of a class I've created (which contains references to other instances of other classes). At some point in the last few weeks, pickling has stopped working with the following error: Traceback (most recent call last): File "./generateTools.py", line 50, in ?...
5
1765
by: Victor Kryukov | last post by:
Hello list, The following behavior is completely unexpected. Is it a bug or a by- design feature? Regards, Victor. -----------------
4
3944
by: Enrico | last post by:
Hi there, I have the following situation (I tryed to minimize the code to concentrate on the issue): def __getattr__(self, name): print 'A.__getattr__' if name == 'a': return 1 raise AttributeError('%s not found in A' % name) def __getattr__(self, name):
0
9424
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
10223
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
10051
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
1
10000
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
0
9866
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
1
7413
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
6675
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
5310
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
2
3571
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.