Re: Cancel instance create

2008-09-09 Thread Fuzzyman
On Sep 6, 1:23 pm, "Diez B. Roggisch" <[EMAIL PROTECTED]> wrote:
> Mohamed Yousef schrieb:
>
> > ðWhat about no Constructor , and a custom instancing function that can
> > return either None or the instance wanted
>
> That doesn't solve the underlying problem - the instance is created.
> Just because it wasn't *returned*, doesn't mean it isn't there.
>
> Diez


def __new__(cls, *args, **kwargs):
if some_condition:
return None
return object.__new__(cls)

Michael Foord
--
http://www.ironpythoninaction.com/
--
http://mail.python.org/mailman/listinfo/python-list


Re: Cancel instance create

2008-09-06 Thread Terry Reedy



Fredrik Lundh wrote:

Aigars Aigars wrote:

I want MyClass to perform some tests and if them fail, I do not want 
instance to be created.


If you do not want the instance created at all, you would have to write 
a custom .__new__ method, but that is tricky, something I would have to 
look up how to do, and most likely not needed.  Fredrik's solution below 
is much easier and the one I would use if at all possible.


But in code I wrote instance is created and also has parameters, that 
it should not have in case of tests failure.


Is there a way to perform tests in MyClass.__init__ and set instance 
to None without any parameters?


if you want construction to fail, raise an exception.

...

def __init__(self):


At this point, you have an instance of your class bound to local name 
'self'.  Usually, its only individual attributes are (in 3.0, anyway, as 
far as I can tell) .__class__ and an empty .__dict__.  Of course, it 
inherits class and superclass attributes, but it is otherwise blank. 
(The main exception would be if you were inheriting from an immutable 
class that set attributes in .__new__, but then you would not be writing 
.__init__.)



self.param = "spam"
Test = False
if Test: # please don't use explicit tests for truth
print "Creating instance..."
else:
raise ValueError("some condition failed")

(pick an exception class that matches the actual error, or create your 
own class if necessary)


Once the exception gets disposed of (if not before), the blank instance 
gets unbound from 'self' and since it does not get bound to anything 
else, it becomes eligible for garbage collection.


tjr

--
http://mail.python.org/mailman/listinfo/python-list


Re: Cancel instance create

2008-09-06 Thread Aigars Aigars
I do not want code outside my class to perform tests and decide to
create instance or not.
Fredrik Lundh's advice to rise exception works perfectly.

Thanks to all,
Aigars
 Quoting Mohamed Yousef : ًWhat about no Constructor , and a
custom instancing function that can
 return either None or the instance wanted
 --
 http://mail.python.org/mailman/listinfo/python-list
 

Links:
--
[1] mailto:[EMAIL PROTECTED]
--
http://mail.python.org/mailman/listinfo/python-list

Re: Cancel instance create

2008-09-06 Thread Diez B. Roggisch

Mohamed Yousef schrieb:

ًWhat about no Constructor , and a custom instancing function that can
return either None or the instance wanted


That doesn't solve the underlying problem - the instance is created. 
Just because it wasn't *returned*, doesn't mean it isn't there.


Diez
--
http://mail.python.org/mailman/listinfo/python-list

Re: Cancel instance create

2008-09-06 Thread Mohamed Yousef
ًWhat about no Constructor , and a custom instancing function that can
return either None or the instance wanted
--
http://mail.python.org/mailman/listinfo/python-list

Re: Cancel instance create

2008-09-06 Thread Fredrik Lundh

Aigars Aigars wrote:

I want MyClass to perform some tests and if them fail, I do not want 
instance to be created.


But in code I wrote instance is created and also has parameters, that it 
should not have in case of tests failure.


Is there a way to perform tests in MyClass.__init__ and set instance to 
None without any parameters?


if you want construction to fail, raise an exception.

...

def __init__(self):
self.param = "spam"
Test = False
if Test: # please don't use explicit tests for truth
print "Creating instance..."
else:
raise ValueError("some condition failed")

(pick an exception class that matches the actual error, or create your 
own class if necessary)




--
http://mail.python.org/mailman/listinfo/python-list