Re: [Python-Dev] UUID module
Fredrik Lundh wrote: > Ka-Ping Yee wrote: > > > Quite a few people have expressed interest in having UUID > > functionality in the standard library, and previously on this > > list some suggested possibly using the uuid.py module i wrote: > > > > http://zesty.ca/python/uuid.py > > +1! +1 as well. I have a couple of suggestions for improving that implementation: 1. You're currently using os.urandom, which can raise a NotImplementedError. You should be prepared to fall back on a different PRNG... which leads to the 2nd suggestion: 2. random.randrange is a method on a default random.Random instance that, although seeded by urandom (if available), may not be the user's preferred PRNG. I recommend making it possible for the user to supply their own random.Random instance for use by the module. That's all. :) ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] Pre-PEP: Allow Empty Subscript List Without Parentheses
On Sat, 10 Jun 2006, Greg Ewing wrote: > I'm having trouble seeing a real use for a 0D array as > something distinct from a scalar, as opposed to them > just being an oddity that happens to arise as a side > effect of the way Numeric/Numpy are implemented. I think the whole discussion about the concept and meaning of zero-dimensional arrays is mostly irrelevant to the original issue. The original issue is a *syntax* question: should x[()] be written as x[]? And from a syntax perspective, it's a bad idea. x[] is much more often a typo than an intentional attempt to index a zero-dimensional array. The compiler should continue to treat it as a syntax error. -- ?!ng ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] Pre-PEP: Allow Empty Subscript List Without Parentheses
Ka-Ping Yee wrote: > And from a syntax perspective, it's a bad idea. x[] is much > more often a typo than an intentional attempt to index a > zero-dimensional array. but how often is it a typo? for example, judging from c.l.python traffic, forgetting to add a return statement is a quite common, but I haven't seen anyone arguing that we deprecate the implied "return None" behaviour. ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] Pre-PEP: Allow Empty Subscript List Without Parentheses
Ka-Ping Yee wrote: > I think the whole discussion about the concept and meaning of > zero-dimensional arrays is mostly irrelevant to the original > issue. The original issue is a *syntax* question: should > x[()] be written as x[]? But, at least as presented in the PEP, it's a syntax that was motivated by a perceived need for dealing with 0D arrays. So it seems relevant to ask whether 0D arrays are really needed or not. Does anyone have any other use case for this syntax? -- Greg ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] beta1 coming real soon
Neal Norwitz wrote: > It's June 9 in most parts of the world. The schedule calls for beta 1 > on June 14. That means there's less than 4 days until the expected > code freeze. Please don't rush to get everything in at the last > minute. The buildbots should remain green to keep Anthony happy and > me sane (or is it the other way around). > > If you plan to make a checkin adding a feature (even a simple one), > you oughta let people know by responding to this message. Please get > the bug fixes in ASAP. Remember to add tests! I still harbour hopes of sorting SF1454481 out in time; if I have it sorted out by 1200UTC (2200AEST) on June 13, I'll merge it from the branch I created for it. "sorted out" includes addressing the issues Tim, Skip & yourself raised. Regards, Andrew. -- - Andrew I MacIntyre "These thoughts are mine alone..." E-mail: [EMAIL PROTECTED] (pref) | Snail: PO Box 370 [EMAIL PROTECTED] (alt) |Belconnen ACT 2616 Web:http://www.andymac.org/ |Australia ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] UUID module
Okay. I have done as Fredrik suggested: > 6. Combine 2 and 3: require the user to pass in a MAC argument > to uuid1, but provide a SlowGetMacAddress helper that wraps > the existing code. I agree with Thomas Wouters: > That sounds like the right thing to do, although I wouldn't call it > "slow"; just let it be documented as 'might not always work and > might be inefficient', The method for getting the node ID is called getnode() and is documented as possibly slow. If a hardware address cannot be obtained, we use a random 48-bit number with the highest bit set to 1, as recommended by RFC 4122. I have done as Skip proposed here: > Or make the MAC address an optional arg to uuid1. If given, use it. > If not, use the slow lookup (then cache the result). I've made the address an optional argument, not a required one, because i think "Explicit better than implicit" applies to changes in output. It makes sense to require an explicit argument if it's actually going to produce a different result, but i don't think it is necessary to require an explicit argument just because the routine might be a bit slow. Letting the address be an optional argument means that in future, we can change the implementation of getnode() to make it faster or more reliable, and users of the module will benefit without having to change any of their code. Finally, Phillip brought up PEAK: > PEAK's uuid module does this such that if win32all is present, > you get a Windows GUID, or if you have a FreeBSD 5+ or > NetBSD 2+ kernel you use the local platform uuidgen API. See e.g.: ...so i looked at PEAK's getnodeid48() routine and borrowed the Win32 calls from there, with a comment giving attribution to PEAK. Oh, and there is now a test suite that should cover all the code paths. This is all posted at http://zesty.ca/python/uuid.py now, documentation page at http://zesty.ca/python/uuid.html, tests at http://zesty.ca/python/test_uuid.py . I'll sleep now (6 am), commit tomorrow unless there are objections. Thanks for your input, everyone! -- ?!ng ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] UUID module
On Sat, 10 Jun 2006, Mike Brown wrote: > I have a couple of suggestions for improving that implementation: > > 1. You're currently using os.urandom, which can raise a NotImplementedError. > You should be prepared to fall back on a different PRNG... The latest version (http://zesty.ca/python/uuid.py) does this. > 2. random.randrange is a method on a default random.Random instance that, > although seeded by urandom (if available), may not be the user's preferred > PRNG. I recommend making it possible for the user to supply their own > random.Random instance for use by the module. I decided not to add more code to do this, because the UUID constructor is now designed in such a way that it's very simple to convert your own randomness into a UUID. If you want to use another source of randomness, you'd just get 16 random bytes and then call UUID(bytes=random_stuff, version=4). That seems simpler to me than adding an extra argument and requiring a randrange() method on it. -- ?!ng ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] beta1 coming real soon
On Thu, 8 Jun 2006, Neal Norwitz wrote: > If you plan to make a checkin adding a feature (even a simple one), > you oughta let people know by responding to this message. Please get > the bug fixes in ASAP. Remember to add tests! Just to make this appear on this thread: i'm planning to check in the uuid.py module at http://zesty.ca/python/uuid.py (with tests). -- ?!ng ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] Pre-PEP: Allow Empty Subscript List Without Parentheses
Greg Ewing wrote: > Ka-Ping Yee wrote: > >> I think the whole discussion about the concept and meaning of >> zero-dimensional arrays is mostly irrelevant to the original >> issue. The original issue is a *syntax* question: should >> x[()] be written as x[]? > > But, at least as presented in the PEP, it's a > syntax that was motivated by a perceived need > for dealing with 0D arrays. So it seems relevant > to ask whether 0D arrays are really needed or not. > > Does anyone have any other use case for this > syntax? I believe the NumPy link Robert posted does a pretty good job of thrashing out the use cases (or lack thereof). I also thought a bit more about the places where the comma separator is used as part of the syntax, and realised that there is no consistent behaviour used when the expression is omitted entirely. In return and yield, omitting the expression is equivalent to using 'None' In print, omitting the expression is equivalent to using the empty string. In raise, omitting the expression has no real equivalent short of: exctype, excval, exctb = sys.exc_info() raise exctype, excval, exctb In an except clause, omitting the expression means the clause handles all exceptions. In a function definition, omitting the expression means the function accepts no arguments. In a function call, omitting the expression is equivalent to writing *(). Most other places (assignment statements, for loops, etc) omitting the expression that may contain a comma separator is simply not permitted. The closest parallel would be with return/yield, as those actually create real tuples the same way subscripts do, and allow the expression to be omitted entirely. By that parallel, however, an implicit subscript (if adopted) should be None rather than (). Adapting the table from the pre-PEP to describe return statements (and yield expressions): return i, j, k <--> return (i, j, k) return i, j <--> return (i, j) return i, <--> return (i, ) return i<--> return (i) return ()# (No implicit equivalent) return <--> return None With the status quo, however, subscripts are simply equivalent to the RHS of an assignment statement in *requiring* that the expression be non-empty: x = i, j, k <--> x = (i, j, k) x = i, j <--> x = (i, j) x = i, <--> x = (i, ) x = i<--> x = (i) x = () # (No implicit equivalent) x = None # (No implicit equivalent) The PEP doesn't make a sufficiently compelling case for introducing yet-another-variant on the implicit behaviour invoked when a particular subexpression is missing from a construct. I guess I could have gone with my initial instinct of -1 and saved myself some mental exercise ;) Cheers, Nick. -- Nick Coghlan | [EMAIL PROTECTED] | Brisbane, Australia --- http://www.boredomandlaziness.org ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] UUID module
On 6/10/06, Ka-Ping Yee <[EMAIL PROTECTED]> wrote: > ...so i looked at PEAK's getnodeid48() routine and borrowed the > Win32 calls from there, with a comment giving attribution to PEAK. Instead of using pywin32, could you use ctypes, as that's part of core Python? It looks like the only Win32 API you use is CoCreateGUID, so wrapping it should be doable... Paul. ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] beta1 coming real soon
Ka-Ping Yee wrote: > On Thu, 8 Jun 2006, Neal Norwitz wrote: >> If you plan to make a checkin adding a feature (even a simple one), >> you oughta let people know by responding to this message. Please get >> the bug fixes in ASAP. Remember to add tests! > > Just to make this appear on this thread: i'm planning to check in > the uuid.py module at http://zesty.ca/python/uuid.py (with tests). Just a quick comment, ipconfig is localized on my system so it'll output something like this: endereço inet6: fe80::20e:a6ff:feac:c3bd/64 Escopo:Link So it needs to be run with LANG set to C to avoid this. Perhaps it would be better to use the same API ipconfig uses, but it's highly platform specific of course. Johan ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] UUID module
Ka-Ping Yee wrote:
> Finally, Phillip brought up PEAK:
>> PEAK's uuid module does this such that if win32all is present,
>> you get a Windows GUID, or if you have a FreeBSD 5+ or
>> NetBSD 2+ kernel you use the local platform uuidgen API. See e.g.:
>
> ...so i looked at PEAK's getnodeid48() routine and borrowed the
> Win32 calls from there, with a comment giving attribution to PEAK.
>
> Oh, and there is now a test suite that should cover all the code paths.
>
> This is all posted at http://zesty.ca/python/uuid.py now,
> documentation page at http://zesty.ca/python/uuid.html,
> tests at http://zesty.ca/python/test_uuid.py .
(From http://zesty.ca/python/uuid.py:)
def win32_getnode():
"""Get the hardware address on Windows using Win32 extensions."""
try:
import pywintypes
return int(pywintypes.CreateGuid()[-13:-1], 16)
except:
pass
try:
import pythoncom
return int(pythoncom.CreateGuid()[-13:-1], 16)
except:
pass
This does not work, for several reasons.
1. (pythoncom|pywintypes).CreateGuid() return a PyIID instance, which you
cannot slice:
>>> import pywintypes
>>> pywintypes.CreateGuid()
IID('{4589E547-4CB5-4BCC-A7C3-6E88FAFB4301}')
>>> type(pywintypes.CreateGuid())
>>> pywintypes.CreateGuid()[-13:-1]
Traceback (most recent call last):
File "", line 1, in ?
TypeError: unsubscriptable object
>>>
So, you would have to change your code to 'str(pythoncom.CreateGuid())[-13:-1]'.
(BTW: Why does it first try pywintypes, the pythoncom?)
2. These functions call to win32 CoCreateGuid function, which create a new uuid.
As documented on MSDN, this calls the UuidCreate function which:
"The UuidCreate function generates a UUID that cannot be traced to the
ethernet/token ring
address of the computer on which it was generated."
In other words, the last 12 characters do *not* identify the mac address, in
fact your function,
if repaired, returns a different result each time it is called. See this link
for
further info:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/rpc/rpc/uuidcreate.asp
A possible solution, if you really need the mac address, is to call the
UuidCreateSequential
function where available (W2k, XP, ...), and UuidCreate on older systems (W98,
ME).
Link to MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/rpc/rpc/uuidcreatesequential.asp
3. Now that ctypes is part of Python, why not use it? This snippet of code
displays the mac address of one of the ethernet adapters I have in my machine:
from ctypes import *
import binascii
class UUID(Structure):
_fields_ = [("Data1", c_ulong),
("Data1", c_ushort),
("Data1", c_ushort),
("Data1", c_ubyte * 8)]
def CreateGuid():
uuid = UUID()
if 0 == windll.rpcrt4.UuidCreateSequential(byref(uuid)):
return str(buffer(uuid))
print binascii.hexlify(CreateGuid()[-6:])
It should be extended to also work on w98 or me, probably.
Thomas
___
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] UUID module
On 6/10/06, Paul Moore <[EMAIL PROTECTED]> wrote:
> On 6/10/06, Ka-Ping Yee <[EMAIL PROTECTED]> wrote:
> > ...so i looked at PEAK's getnodeid48() routine and borrowed the
> > Win32 calls from there, with a comment giving attribution to PEAK.
>
> Instead of using pywin32, could you use ctypes, as that's part of core
> Python? It looks like the only Win32 API you use is CoCreateGUID, so
> wrapping it should be doable...
Here's some sample code (taken from Thomas Heller's comtypes module)
>>> from ctypes import oledll, Structure, byref
>>> from ctypes.wintypes import BYTE, WORD, DWORD
>>> class GUID(Structure):
... _fields_ = [("Data1", DWORD),
... ("Data2", WORD),
... ("Data3", WORD),
... ("Data4", BYTE * 8)]
...
>>> guid = GUID()
>>> oledll.ole32.CoCreateGuid(byref(guid))
0
>>> guid
<__main__.GUID object at 0x00978EE0>
>>> guid.Data1
3391869098L
>>> guid.Data2
51115
>>> guid.Data3
20060
>>> guid.Data4
<__main__.c_byte_Array_8 object at 0x00978E40>
>>>
I'm not sure what the int(...[-13,-1], 16) does (as it stands, it
fails for me - I think you need to put str() round the CreateGuid
call) but I *think* it's the equivalent of guid.Data1 above.
So, you'd have:
def win32_getnode():
"""Get the hardware address on Windows using Win32 extensions."""
from ctypes import oledll, Structure, byref
from ctypes.wintypes import BYTE, WORD, DWORD
class GUID(Structure):
_fields_ = [("Data1", DWORD),
("Data2", WORD),
("Data3", WORD),
("Data4", BYTE * 8)]
guid = GUID()
oledll.ole32.CoCreateGuid(byref(guid))
return guid.Data1
Hope this is of use.
Paul.
___
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] UUID module
Hi Thomas, > This does not work, for several reasons. > > 1. (pythoncom|pywintypes).CreateGuid() return a PyIID instance, which you > cannot slice: You're right. The PEAK code must have been based on an earlier version of the CreateGuid() routine. I've fixed this, and added detection of the UUID version so that the MAC address will only be picked up if the UUID version is 1. > (BTW: Why does it first try pywintypes, the pythoncom?) Because PEAK does this, and i see the CreateGuid routine imported from both modules in Google searches for code, i assumed that it used to live in one module and moved to the other. I've also figured out how to get the MAC address using NetBIOS calls, and added that to the repertoire of methods. I've tested this and it works fast. I think this may be better than UuidCreateSequential, because it should work on both Win98 and XP. The updated version is posted at http://zesty.ca/python/uuid.py . -- ?!ng ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] UUID module
Ka-Ping Yee wrote: > Hi Thomas, > >> This does not work, for several reasons. >> >> 1. (pythoncom|pywintypes).CreateGuid() return a PyIID instance, which you >> cannot slice: > > You're right. The PEAK code must have been based on an earlier > version of the CreateGuid() routine. > > I've fixed this, and added detection of the UUID version so that > the MAC address will only be picked up if the UUID version is 1. > >> (BTW: Why does it first try pywintypes, the pythoncom?) > > Because PEAK does this, and i see the CreateGuid routine imported > from both modules in Google searches for code, i assumed that it > used to live in one module and moved to the other. > > I've also figured out how to get the MAC address using NetBIOS > calls, and added that to the repertoire of methods. I've tested > this and it works fast. I think this may be better than > UuidCreateSequential, because it should work on both Win98 and XP. I have not tested the speed, but extending my snippet to also work on 98 should be nearly trivial: try: _func = windll.rpcrt4.UuidCreateSequential except AttributeError: _func = windll.rpcrt4.UuidCreate def CreateGuid(): uuid = UUID() if 0 == _func(byref(uuid)): return str(buffer(uuid)) Thomas ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] beta1 coming real soon
On 6/10/06, Johan Dahlin <[EMAIL PROTECTED]> wrote:
> Ka-Ping Yee wrote:
> > On Thu, 8 Jun 2006, Neal Norwitz wrote:
> >> If you plan to make a checkin adding a feature (even a simple one),
> >> you oughta let people know by responding to this message. Please get
> >> the bug fixes in ASAP. Remember to add tests!
> >
> > Just to make this appear on this thread: i'm planning to check in
> > the uuid.py module at http://zesty.ca/python/uuid.py (with tests).
>
> Just a quick comment, ipconfig is localized on my system so it'll output
> something like this:
>
>endereço inet6: fe80::20e:a6ff:feac:c3bd/64 Escopo:Link
>
> So it needs to be run with LANG set to C to avoid this.
Actually, the code uses "ifconfig", which doesn't exist on Windows.
You want the command "ipconfig /all". And it assumes Windows is
installed on the C: drive (normal, but not guaranteed).
> Perhaps it would be better to use the same API ipconfig uses, but it's
> highly platform specific of course.
Here's a VB script that gets all the MAC addresses on the system using WMI:
Dim objNetworkAdapters, objAdapter, objWMI
Set objWMI = Nothing
Set objWMI = GetObject("winmgmts:")
' Get a list of IP-enabled adapters.
Set objNetworkAdapters = objWMI.ExecQuery("select * from
Win32_NetworkAdapterConfiguration where IPEnabled = 1")
For Each objAdapter In objNetworkAdapters
wscript.echo "Network adapter: " & objAdapter.Caption & " has
MAC address " & objAdapter.MacAddress
Next
It might be worth noting that on my PC, this gets one "real" network
adapter, and two VMWare virtual adapter. Whether this affects things,
I don't know. This script and ipconfig /all give the adapters in
different orders.
Paul.
___
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] UUID module
On Sat, 10 Jun 2006, Thomas Heller wrote: > I have not tested the speed, but extending my snippet to also work > on 98 should be nearly trivial: > > try: > _func = windll.rpcrt4.UuidCreateSequential > except AttributeError: > _func = windll.rpcrt4.UuidCreate > > def CreateGuid(): > uuid = UUID() > if 0 == _func(byref(uuid)): > return str(buffer(uuid)) Okay. Thanks for this. I'll give it a shot. -- ?!ng ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] beta1 coming real soon
On Sat, 10 Jun 2006, Paul Moore wrote: > Actually, the code uses "ifconfig", which doesn't exist on Windows. > You want the command "ipconfig /all". I fixed that before you posted this message. :) -- ?!ng ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] beta1 coming real soon
On 6/10/06, Ka-Ping Yee <[EMAIL PROTECTED]> wrote: > On Sat, 10 Jun 2006, Paul Moore wrote: > > Actually, the code uses "ifconfig", which doesn't exist on Windows. > > You want the command "ipconfig /all". > > I fixed that before you posted this message. :) Give Guido the time machine keys back! :-) Paul. ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] UUID module
At 08:22 AM 6/10/2006 -0500, Ka-Ping Yee wrote: >Finally, Phillip brought up PEAK: > > PEAK's uuid module does this such that if win32all is present, > > you get a Windows GUID, or if you have a FreeBSD 5+ or > > NetBSD 2+ kernel you use the local platform uuidgen API. See e.g.: > >...so i looked at PEAK's getnodeid48() routine and borrowed the >Win32 calls from there, with a comment giving attribution to PEAK. There appears to be a transcription error, there; the second win32 import isn't covered by a try/except and the ImportError seems to have disappeared as well. Also, for Python 2.5, these imports could probably be replaced with a ctypes call, though I'm not experienced enough w/ctypes to figure out what the call should be. Similarly, for the _uuidgen module, you've not included the C source for that module or the setup.py incantations to build it. But again, it could probably be replaced by ctypes calls to uuidgen(2) on BSD-ish platforms. I'll take a whack at addressing these once the code is in, though, unless there's a ctypes guru or two available...? ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] UUID module
On Sat, 10 Jun 2006, Thomas Heller wrote: > [some nice ctypes code] Done. Works like a charm. Thanks for providing the code! On Sat, 10 Jun 2006, Phillip J. Eby wrote: > Also, for Python 2.5, these imports could probably be replaced with a > ctypes call, though I'm not experienced enough w/ctypes to figure out what > the call should be. Happily, we have *the* ctypes guru here, and he's solved the problem for Windows at least. > Similarly, for the _uuidgen module, you've not included the C source for > that module or the setup.py incantations to build it. Yes, the idea was that even though _uuidgen isn't included with core Python, users would magically benefit if they installed it (or if they happen to be using Python in a distribution that includes it); it's the same idea with the stuff that refers to Win32 extensions. Is the presence of _uuidgen sufficiently rare that i should leave out uuidgen_getnode() for now, then? -- ?!ng ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] beta1 coming real soon
On 9-jun-2006, at 20:22, Martin v. Löwis wrote: > Ronald Oussoren wrote: >> How hard is the feature freeze? Would it be possible to update the >> Carbon bindings after beta1? Given Apple's focus on backward >> compatibility the update should only add new functionality, not >> remove existing functions/types. > > I'd say it's absolute wrt. to requiring permission from the release > manager. I suppose that's as good as it gets, and that's fine by me. The reason I asked is that if the anwer would be "no way" I definitely wouldn't bother to spent time on this. > > The point of not allowing new features after a beta release is > that one wants to avoid getting untested new features into a release. > For that goal, it is not that relevant whether the new features > are guaranteed not to break any existing features - they still > don't get the testing that the beta releases try to achieve. If the past is any prediction of the future beta releases won't result in enough testing of the Carbon wrappers :-/. AFAIK there are known issues with at least some of the wrappers but sadly enough those issues are not on the tracker. I know of problems with OSA support because an external package that uses those extensions has basicly forked them to be able to apply bugfixes. I've just sent a message to the pythonmac-sig to ask people to file bugreports about problems they'd like to see fixed. Hopefully Python 2.5 will see more testing on the mac because there will be prompt binary releases of the betas this time around. Ronald ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] 2.5 issues need resolving in a few days
Neal Norwitz wrote: > There is still the missing documentation for ctypes and element tree. > I know there's been progress on ctypes. What are we going to do about > ElementTree? Are we going to have another undocumented module in the > core if all undocumented modules had as much documentation and articles as ET, the world would be a lot better documented ;-) I've posted a text version of the xml.etree.ElementTree PythonDoc here: http://www.python.org/sf/1504046 hopefully, one of the anything-to-latex volunteers will pick this up shortly; otherwise, I'll deal with that early next week. ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] UUID module
Phillip J. Eby wrote:
> At 08:22 AM 6/10/2006 -0500, Ka-Ping Yee wrote:
>>Finally, Phillip brought up PEAK:
>> > PEAK's uuid module does this such that if win32all is present,
>> > you get a Windows GUID, or if you have a FreeBSD 5+ or
>> > NetBSD 2+ kernel you use the local platform uuidgen API. See e.g.:
>>
>>...so i looked at PEAK's getnodeid48() routine and borrowed the
>>Win32 calls from there, with a comment giving attribution to PEAK.
>
> There appears to be a transcription error, there; the second win32 import
> isn't covered by a try/except and the ImportError seems to have disappeared
> as well.
>
> Also, for Python 2.5, these imports could probably be replaced with a
> ctypes call, though I'm not experienced enough w/ctypes to figure out what
> the call should be.
>
> Similarly, for the _uuidgen module, you've not included the C source for
> that module or the setup.py incantations to build it. But again, it could
> probably be replaced by ctypes calls to uuidgen(2) on BSD-ish platforms.
>
> I'll take a whack at addressing these once the code is in, though, unless
> there's a ctypes guru or two available...?
I don't know if this is the uuidgen you're talking about, but on linux there
is libuuid:
>>> from ctypes import *
>>> lib = CDLL("libuuid.so.1")
>>> uuid = create_string_buffer(16)
>>> lib.uuid_generate(byref(uuid))
2131088494
>>> from binascii import hexlify
>>> hexlify(buffer(uuid))
'0c77b6d7e5f940b18e29a749057f6ed4'
>>>
___
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] UUID module
At 11:16 AM 6/10/2006 -0500, Ka-Ping Yee wrote: >On Sat, 10 Jun 2006, Thomas Heller wrote: > > [some nice ctypes code] > >Done. Works like a charm. Thanks for providing the code! > >On Sat, 10 Jun 2006, Phillip J. Eby wrote: > > Also, for Python 2.5, these imports could probably be replaced with a > > ctypes call, though I'm not experienced enough w/ctypes to figure out what > > the call should be. > >Happily, we have *the* ctypes guru here, and he's solved the problem >for Windows at least. > > > Similarly, for the _uuidgen module, you've not included the C source for > > that module or the setup.py incantations to build it. > >Yes, the idea was that even though _uuidgen isn't included with core >Python, users would magically benefit if they installed it (or if they >happen to be using Python in a distribution that includes it); _uuidgen is actually peak.util._uuidgen; as far as I know, that's the only place you can get it. > it's >the same idea with the stuff that refers to Win32 extensions. Is the >presence of _uuidgen sufficiently rare that i should leave out >uuidgen_getnode() for now, then? Either that, or we could add the code in to build it. PEAK's setup.py does some relatively simple platform checks to determine whether you're on a BSD that has it. The other alternative is to ask the guru nicely if he'll provide another ctypes snippet to call the uuidgen(2) system call if present. :) By the way, I'd love to see a uuid.uuid() constructor that simply calls the platform-specific default UUID constructor (CoCreateGuid or uuidgen(2)), if available, before falling back to one of the Python implementations. Most of my UUID-using application code doesn't really care what type of UUID it gets, and if the platform has an efficient mechanism, it'd be convenient to use it. ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] UUID module
At 06:39 PM 6/10/2006 +0200, Thomas Heller wrote:
>I don't know if this is the uuidgen you're talking about, but on linux there
>is libuuid:
>
> >>> from ctypes import *
> >>> lib = CDLL("libuuid.so.1")
> >>> uuid = create_string_buffer(16)
> >>> lib.uuid_generate(byref(uuid))
>2131088494
> >>> from binascii import hexlify
> >>> hexlify(buffer(uuid))
>'0c77b6d7e5f940b18e29a749057f6ed4'
> >>>
Nice. :) But no, this one's a uuidgen() system call on FreeBSD>=5.0 and
NetBSD>=2.0; it may be in other BSD variants as well... perhaps OS X?
NAME
uuidgen -- generate universally unique identifiers
LIBRARY
Standard C Library (libc, -lc)
SYNOPSIS
#include
#include
int
uuidgen(struct uuid *store, int count);
DESCRIPTION
The uuidgen() system call generates count universally unique identifiers
(UUIDs) and writes them to the buffer pointed to by store. The identi-
fiers are generated according to the syntax and semantics of the DCE ver-
sion 1 variant of universally unique identifiers. See below for a more
in-depth description of the identifiers. When no IEEE 802 address is
available for the node field, a random multi-cast address is generated
for each invocation of the system call. According to the algorithm of
generating time-based UUIDs, this will also force a new random clock
sequence, thereby increasing the likelihood for the identifier to be
unique.
When multiple identifiers are to be generated, the uuidgen() system call
will generate a set of identifiers that is dense in such a way that there
is no identifier that is larger than the smallest identifier in the set
and smaller than the largest identifier in the set and that is not
already in the set.
Universally unique identifiers, also known as globally unique identifiers
(GUIDs), have a binary representation of 128-bits. The grouping and
meaning of these bits is described by the following structure and its
description of the fields that follow it:
struct uuid {
uint32_ttime_low;
uint16_ttime_mid;
uint16_ttime_hi_and_version;
uint8_t clock_seq_hi_and_reserved;
uint8_t clock_seq_low;
uint8_t node[_UUID_NODE_LEN];
};
time_low The least significant 32 bits of a 60-bit
timestamp. This field is stored in the native
byte-order.
time_mid The least significant 16 bits of the most sig-
nificant 28 bits of the 60-bit timestamp.
This field is stored in the native byte-order.
time_hi_and_versionThe most significant 12 bits of the 60-bit
timestamp multiplexed with a 4-bit version
number. The version number is stored in the
most significant 4 bits of the 16-bit field.
This field is stored in the native byte-order.
clock_seq_hi_and_reserved The most significant 6 bits of a 14-bit
sequence number multiplexed with a 2-bit vari-
ant value. Note that the width of the variant
value is determined by the variant itself.
Identifiers generated by the uuidgen() system
call have variant value 10b. the variant
value is stored in the most significant bits
of the field.
clock_seq_low The least significant 8 bits of a 14-bit
sequence number.
node The 6-byte IEEE 802 (MAC) address of one of
the interfaces of the node. If no such inter-
face exists, a random multi-cast address is
used instead.
The binary representation is sensitive to byte ordering. Any multi-byte
field is to be stored in the local or native byte-order and identifiers
must be converted when transmitted to hosts that do not agree on the
byte-order. The specification does not however document what this means
in concrete terms and is otherwise beyond the scope of this system call.
RETURN VALUES
Upon successful completion, the value 0 is returned; otherwise the
value -1 is returned and the global variable errno is set to indicate the
error.
ERRORS
The uuidgen() system call can fail with:
[EFAULT] The buffer pointed to by store could not be written to
for any or all identifiers.
[EINVAL] The count argument is less than 1 or larger than the
hard upper limit of 2048.
SEE ALSO
uuidgen(1), uuid(3)
STANDARDS
The identifiers are represented and generated
Re: [Python-Dev] Pre-PEP: Allow Empty Subscript List Without Parentheses
Hello, I'll try to answer the questions in one message. Sorry for not being able to do it until now. About the joke - it isn't, I really need it. About the timing - Of course, I can live with this getting into 2.6, and I think that I may even be able to stay alive if this were rejected. I still personally think that if people agree that it's a good idea it might get in, since there's almost nothing to be decided except for that - but of course, I can understand not wanting to rush things too much. About whether NumPy should return real scalars or 0-dimensional arrays - I don't know. About the use case - I think that's the real thing I didn't explain well and needs explanation, so I will try to do it better this time. I'm talking about something similar to a spreadsheet in that it saves data, calculation results, and the way to produce the results. However, it is not similar to a spreadsheet in that the data isn't saved in an infinite two-dimensional array with numerical indices. Instead, the data is saved in a few "tables", each storing a different kind of data. The tables may be with any desired number of dimensions, and are indexed by meaningful indices, instead of by natural numbers. For example, you may have a table called sales_data. It will store the sales data in years from set([2003, 2004, 2005]), for car models from set(['Subaru', 'Toyota', 'Ford']), for cities from set(['Jerusalem', 'Tel Aviv', 'Haifa']). To refer to the sales of Ford in Haifa in 2004, you will simply write: sales_data[2004, 'Ford', 'Haifa']. If the table is a source of data (that is, not calculated), you will be able to set values by writing: sales_data[2004, 'Ford', 'Haifa'] = 1500. Tables may be computed tables. For example, you may have a table which holds for each year the total sales in that year, with the income tax subtracted. It may be defined by a function like this: lambda year: sum(sales_data[year, model, city] for model in models for city in cities) / (1 + income_tax_rate) Now, like in a spreadsheet, the function is kept, so that if you change the data, the result will be automatically recalculated. So, if you discovered a mistake in your data, you will be able to write: sales_data[2004, 'Ford', 'Haifa'] = 2000 and total_sales[2004] will be automatically recalculated. Now, note that the total_sales table depends also on the income_tax_rate. This is a variable, just like sales_data. Unlike sales_data, it's a single value. We should be able to change it, with the result of all the cells of the total_sales table recalculated. But how will we do it? We can write income_tax_rate = 0.18 but it will have a completely different meaning. The way to make the income_tax_rate changeable is to think of it as a 0-dimensional table. It makes sense: sales_data depends on 3 parameters (year, model, city), total_sales depends on 1 parameter (year), and income_tax_rate depends on 0 parameters. That's the only difference. So, thinking of it like this, we will simply write: income_tax_rate[] = 0.18 Now the system can know that the income tax rate has changed, and recalculate what's needed. We will also have to change the previous function a tiny bit, to: lambda year: sum(sales_data[year, model, city] for model in models for city in cities) / (1 + income_tax_rate[]) But it's fine - it just makes it clearer that income_tax_rate[] is a part of the model that may change its value. I hope that I managed to explain the use case better this time - please ask if my description isn't clear enough. Thanks for your comments, please send more, Noam ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
[Python-Dev] a note in random.shuffle.__doc__ ...
...claims: Note that for even rather small len(x), the total number of permutations of x is larger than the period of most random number generators; this implies that "most" permutations of a long sequence can never be generated. Now -- why would the behavior of "most" random number generators be relevant here? The module's docs claim, for its specific Mersenne Twister generator, a period of 2**19997-1, which is (e.g.) a comfortable 130128673800676351960752618754658780303412233749552410245124492452914636 028095467780746435724876612802011164778042889281426609505759158196749438 742986040468247017174321241233929215223326801091468184945617565998894057 859403269022650639413550466514556014961826309062543 times larger than the number of permutations of 2000 items, which doesn't really feel to me like a "rather small len(x)" in this context (what I'm most often shuffling is just a pack of cards -- len(x)==52 -- for example). I suspect that the note is just a fossil from a time when the default random number generator was Whichman-Hill, with a much shorter period. Should this note just be removed, or instead somehow reworded to point out that this is not in fact a problem for the module's current default random number generator? Opinions welcome! Alex ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] 2.5 issues need resolving in a few days
On Saturday 10 June 2006 12:34, Fredrik Lundh wrote: > if all undocumented modules had as much documentation and articles as > ET, the world would be a lot better documented ;-) > > I've posted a text version of the xml.etree.ElementTree PythonDoc here: Here's a question that we should answer before the beta: With the introduction of the xmlcore package in Python 2.5, should we document xml.etree or xmlcore.etree? If someone installs PyXML with Python 2.5, I don't think they're going to get xml.etree, which will be really confusing. We can be sure that xmlcore.etree will be there. I'd rather not propogate the pain caused "xml" package insanity any further. -Fred -- Fred L. Drake, Jr. ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] Pre-PEP: Allow Empty Subscript List Without Parentheses
Hello, 2006/6/10, Nick Coghlan <[EMAIL PROTECTED]>: > The closest parallel would be with return/yield, as those actually create real > tuples the same way subscripts do, and allow the expression to be omitted > entirely. > > By that parallel, however, an implicit subscript (if adopted) should be None > rather than (). > > Adapting the table from the pre-PEP to describe return statements (and yield > expressions): > > return i, j, k <--> return (i, j, k) > return i, j <--> return (i, j) > return i, <--> return (i, ) > return i<--> return (i) >return ()# (No implicit equivalent) > return <--> return None > > With the status quo, however, subscripts are simply equivalent to the RHS of > an assignment statement in *requiring* that the expression be non-empty: > > x = i, j, k <--> x = (i, j, k) > x = i, j <--> x = (i, j) > x = i, <--> x = (i, ) > x = i<--> x = (i) > x = () # (No implicit equivalent) > x = None # (No implicit equivalent) > > The PEP doesn't make a sufficiently compelling case for introducing > yet-another-variant on the implicit behaviour invoked when a particular > subexpression is missing from a construct. > I hope that my (hopefully) better explanation made the use case more compelling, but I want to add two points in favour of an empty tuple: 1. If you want, you can ignore the x[(i, j, k)] equivalence completely, since it doesn't work all the times - for example, you can write "x[1:2, 3:4]", but you can't write "x[(1:2, 3:4)]". You can think of x[i, j, k] as a syntax for specifying a cell in a 3-dimensional array, resulting in a call to x.__getitem__ with a 3-tuple describing the subscript for each dimension. In that view, "x[]", which is a syntax for specifying the cell of a 0-dimensional, should result in a __getitem__ call with an empty tuple, as there are no subscripts to be described. 2. My equivalencies are better than yours :-), since they are dealing with equivalencies for this specific syntax, while yours are dealing with similar properies of a syntax for doing something completely different. > I guess I could have gone with my initial instinct of -1 and saved myself some > mental exercise ;) Why? Mental exercise is a good way to keep you mental ;) Noam ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] FYI: wsgiref is now checked in
Just noticed that, at least on Windows, test_wsgiref fails when Python
is run with -O (but passes without -O):
$ python -O -E -tt ../Lib/test/regrtest.py -v test_wsgiref
test_wsgiref
testAbstractMethods (test.test_wsgiref.HandlerTests) ... ok
testBasicErrorOutput (test.test_wsgiref.HandlerTests) ... ok
testCGIEnviron (test.test_wsgiref.HandlerTests) ... ok
testContentLength (test.test_wsgiref.HandlerTests) ... ok
testEnviron (test.test_wsgiref.HandlerTests) ... ok
testErrorAfterOutput (test.test_wsgiref.HandlerTests) ... ok
testHeaderFormats (test.test_wsgiref.HandlerTests) ... ok
testScheme (test.test_wsgiref.HandlerTests) ... ok
testExtras (test.test_wsgiref.HeaderTests) ... ok
testMappingInterface (test.test_wsgiref.HeaderTests) ... ok
testRequireList (test.test_wsgiref.HeaderTests) ... ok
test_plain_hello (test.test_wsgiref.IntegrationTests) ... ok
test_simple_validation_error (test.test_wsgiref.IntegrationTests) ... FAIL
test_validated_hello (test.test_wsgiref.IntegrationTests) ... ok
testAppURIs (test.test_wsgiref.UtilityTests) ... ok
testCrossDefaults (test.test_wsgiref.UtilityTests) ... ok
testDefaults (test.test_wsgiref.UtilityTests) ... ok
testFileWrapper (test.test_wsgiref.UtilityTests) ... FAIL
testGuessScheme (test.test_wsgiref.UtilityTests) ... ok
testHopByHop (test.test_wsgiref.UtilityTests) ... ok
testNormalizedShifts (test.test_wsgiref.UtilityTests) ... ok
testReqURIs (test.test_wsgiref.UtilityTests) ... ok
testSimpleShifts (test.test_wsgiref.UtilityTests) ... ok
==
FAIL: test_simple_validation_error (test.test_wsgiref.IntegrationTests)
--
Traceback (most recent call last):
File "C:\Code\python\lib\test\test_wsgiref.py", line 156, in
test_simple_validation_error
"AssertionError: Headers (('Content-Type', 'text/plain')) must"
AssertionError: 'ValueError: too many values to unpack' !=
"AssertionError: Headers (('Content-Type', 'text/plain')) mus
t be of type list: "
==
FAIL: testFileWrapper (test.test_wsgiref.UtilityTests)
--
Traceback (most recent call last):
File "C:\Code\python\lib\test\test_wsgiref.py", line 312, in testFileWrapper
self.checkFW("xyz"*50, 120, ["xyz"*40,"xyz"*10])
File "C:\Code\python\lib\test\test_wsgiref.py", line 211, in checkFW
compare_generic_iter(make_it,match)
File "C:\Code\python\lib\test\test_wsgiref.py", line 100, in
compare_generic_iter
raise AssertionError("Too many items from __getitem__",it)
AssertionError: ('Too many items from __getitem__',
)
--
Ran 23 tests in 0.046s
FAILED (failures=2)
test test_wsgiref failed -- errors occurred; run in verbose mode for details
1 test failed:
test_wsgiref
This may be because compare_generic_iter() uses `assert` statements,
and those vanish under -O. If so, a test shouldn't normally use
`assert`. On rare occasions it's appropriate, like test_struct's:
if x < 0:
expected += 1L << self.bitsize
assert expected > 0
That isn't testing any of struct's functionality, it's documenting and
verifying a fundamental _belief_ of the test author's: the test
itself is buggy if that assert ever triggers. Or, IOW, it's being
used for what an assert statement should be used for :-)
___
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] UUID module
Phillip J. Eby wrote:
> At 06:39 PM 6/10/2006 +0200, Thomas Heller wrote:
>>I don't know if this is the uuidgen you're talking about, but on linux there
>>is libuuid:
>>
>> >>> from ctypes import *
>> >>> lib = CDLL("libuuid.so.1")
>> >>> uuid = create_string_buffer(16)
>> >>> lib.uuid_generate(byref(uuid))
>>2131088494
>> >>> from binascii import hexlify
>> >>> hexlify(buffer(uuid))
>>'0c77b6d7e5f940b18e29a749057f6ed4'
>> >>>
>
> Nice. :) But no, this one's a uuidgen() system call on FreeBSD>=5.0 and
> NetBSD>=2.0; it may be in other BSD variants as well... perhaps OS X?
For completeness :-), although its probably getting off-topic:
$ uname -a
FreeBSD freebsd 6.0-RELEASE FreeBSD 6.0-RELEASE #0: Thu Nov 3 09:36:13 UTC
2005 [EMAIL PROTECTED]:/usr/obj/usr/src/sys/GENERIC i386
$ python
Python 2.4.1 (#2, Oct 12 2005, 01:36:32)
[GCC 3.4.4 [FreeBSD] 20050518] on freebsd6
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes.util import find_library
>>> find_library("c")
'libc.so.6'
>>> from ctypes import *
>>> libc = CDLL("libc.so.6")
>>> uuid = create_string_buffer(16)
>>> libc.uuidgen(uuid, 1)
0
>>> uuid[:]
'\xd2\xff\x8e\xe3\xa3\xf8\xda\x11\xb0\x04\x00\x0c)\xd1\x18\x06'
>>>
$
On OS X, this call is not available, but /usr/lib/libc.dylib
has a uuid_generate function which is apparently compatible to
the linux example I posted above.
Thomas
___
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] beta1 coming real soon
On Sat, Jun 10, 2006, Ronald Oussoren wrote: > > Hopefully Python 2.5 will see more testing on the mac because there > will be prompt binary releases of the betas this time around. If there is in fact a binary beta release for OS X, there will definitely be testing because we need to double-check all our 2.5 claims for Python for Dummies (and my co-author only uses a Mac). -- Aahz ([EMAIL PROTECTED]) <*> http://www.pythoncraft.com/ "I saw `cout' being shifted "Hello world" times to the left and stopped right there." --Steve Gonedes ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] a note in random.shuffle.__doc__ ...
Alex Martelli <[EMAIL PROTECTED]> wrote: > > ...claims: > > Note that for even rather small len(x), the total number of > permutations of x is larger than the period of most random number > generators; this implies that "most" permutations of a long > sequence can never be generated. [snip] > I suspect that the note is just a fossil from a time when the default > random number generator was Whichman-Hill, with a much shorter > period. Should this note just be removed, or instead somehow > reworded to point out that this is not in fact a problem for the > module's current default random number generator? Opinions welcome! I'm recovering from a migraine, but here are my thoughts on the topic... The number of permutations of n items is n!, which is > (n/2)^(n/2). Solve: 2**19997 < (n/2)^(n/2) log_2(2**19997) < log_2((n/2)^(n/2)) 19997 < (n/2)*log(n/2) Certainly with n >= 4096, the above holds (2048 * 11 = 22528) - Josiah ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] beta1 coming real soon
On 10-jun-2006, at 21:32, Aahz wrote: > On Sat, Jun 10, 2006, Ronald Oussoren wrote: >> >> Hopefully Python 2.5 will see more testing on the mac because there >> will be prompt binary releases of the betas this time around. > > If there is in fact a binary beta release for OS X, there will > definitely be testing because we need to double-check all our 2.5 > claims > for Python for Dummies (and my co-author only uses a Mac). There will be a binary release and I'll be making it :-). Does Python for Dummies cover using the Carbon package (the part that seems to get limited testing)? Given the title of the book I'd be (pleasantly) surprised. Ronald ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] UUID module
Paul Moore wrote: > On 6/10/06, Ka-Ping Yee <[EMAIL PROTECTED]> wrote: >> ...so i looked at PEAK's getnodeid48() routine and borrowed the >> Win32 calls from there, with a comment giving attribution to PEAK. > > Instead of using pywin32, could you use ctypes, as that's part of core > Python? It looks like the only Win32 API you use is CoCreateGUID, so > wrapping it should be doable... http://docs.python.org/dev/lib/module-msilib.html#l2h-5633 Regards, Martin ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] UUID module
Thomas> On OS X, this call is not available, but /usr/lib/libc.dylib has
Thomas> a uuid_generate function which is apparently compatible to the
Thomas> linux example I posted above.
Confirmed:
% python
Python 2.5a2 (trunk:46644M, Jun 4 2006, 10:58:16)
[GCC 4.0.0 (Apple Computer, Inc. build 5026)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes.util import find_library
>>> print find_library("c")
/usr/lib/libc.dylib
>>> from ctypes import *
>>> libc = CDLL("libc.dylib")
>>> uuid = create_string_buffer(16)
>>> libc.uuid_generate(uuid, 1)
-1073747536
>>> print repr(uuid[:])
'[EMAIL PROTECTED]'
Skip
___
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] a note in random.shuffle.__doc__ ...
Josiah Carlson <[EMAIL PROTECTED]> wrote: > > Alex Martelli <[EMAIL PROTECTED]> wrote: > > > > ...claims: > > > > Note that for even rather small len(x), the total number of > > permutations of x is larger than the period of most random number > > generators; this implies that "most" permutations of a long > > sequence can never be generated. > [snip] > > I suspect that the note is just a fossil from a time when the default > > random number generator was Whichman-Hill, with a much shorter > > period. Should this note just be removed, or instead somehow > > reworded to point out that this is not in fact a problem for the > > module's current default random number generator? Opinions welcome! > > I'm recovering from a migraine, but here are my thoughts on the topic... > > The number of permutations of n items is n!, which is > (n/2)^(n/2). > Solve: 2**19997 < (n/2)^(n/2) > log_2(2**19997) < log_2((n/2)^(n/2)) > 19997 < (n/2)*log(n/2) > > Certainly with n >= 4096, the above holds (2048 * 11 = 22528) > > - Josiah I would also point out that even if MT had a larger period, there would still be no guarantee that all permutations of a given sequence would be able to be generated from the PRNG given some aribtrary internal state. - Josiah ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] [Web-SIG] wsgiref doc draft; reviews/patches wanted
On 6/9/06, Phillip J. Eby <[EMAIL PROTECTED]> wrote: > >4. I believe the order of submodules presented is important and think that > >they should be listed with 'handlers' and 'simple_server' first: > > I agree that the order is important, but I intentionally chose the current > order to be a gentle slope of complexity, from the near-trivial functions > on up to the server/handler framework last. I'm not sure what ordering > principle you're suggesting to use instead. When I first hit the documentation I was confused by the order. This is wsgiref, a reference implementation of wsgi and I expected wsgi servers and middleware, actual implementations of WSGI, to be the most prominent part of the library and thus presented first. The utility functions would come afterward, after you got the basic wsgi pieces in place. -joe -- Joe Gregoriohttp://bitworking.org ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
[Python-Dev] Segmentation fault in collections.defaultdict
An aside before I report this bug:_I_HATE_SOURCEFORGE_. If it doesn't bloody accept anonymous bug reports then it bloody well shouldn't let you type in a nice, detailed, well through-out report and then toss it in the toilet when you hit Submit, and also not allow one dive in after it by using the browser back button to recover the text. AAARRGGHH!! Anyhow, back to our regularly scheduled bug report, which as we know should have gone to Sourceforge, but isn't because I don't have time for more of that particular form of masochism. (If that doesn't sit well with you, then feel free to ignore any scribblings below.) Try this at home:import collectionsd=collections.defaultdict(int)d.iterkeys().next() # Seg faultd.iteritems().next() # Seg faultd.itervalues().next() # Fine and dandyPython version: Python 2.5a2 (trunk:46822M, Jun 10 2006, 13:14:15)[GCC 4.0.2 20050901 (prerelease) (SUSE Linux)] on linux2Discussion:The segmentation fault only occurs where we'd expect StopIteration to be raised. ie, if the defaultdict has 3 elements, then only the fourth call will result in a segmentation fault. Based on the following traceback, The failure occurs at dictobject.c:dictiter_iternextkey:2204, which attempts to INCREF the next non-existent key in the sequence. Thus the current code does not properly detect when it has run out of elements.Not having an intimate knowledge of the internals of dictobject.c or the new defaultdict implementation, the underlying problem is not immediately apparent. I wish I had more time to follow up on this, but my "random poking around time" is already overdrawn and I must get back to less enjoyable pursuits. Traceback:> gdb ./pythonGNU gdb 6.3Copyright 2004 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" for details.This GDB was configured as "x86_64-suse-linux"...Using host libthread_db library "/lib64/tls/libthread_db.so.1". (gdb) r t.pyStarting program: src/python-trunk/python t.py[Thread debugging using libthread_db enabled][New Thread 46912504205344 (LWP 12545)]Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 46912504205344 (LWP 12545)]dictiter_iternextkey (di=0x2ab980a0) at dictobject.c:22042204 Py_INCREF(key);(gdb) back#0 dictiter_iternextkey (di=0x2ab980a0) at dictobject.c :2204#1 0x00460366 in wrap_next (self=, args=, wrapped=) at typeobject.c:3846#2 0x00415adc in PyObject_Call (func=0x2ab90a50, arg=0x2aac2050, kw=0x0) at abstract.c:1802#3 0x00481217 in PyEval_EvalFrameEx (f=0x6df8f0, throwflag=) at ceval.c:3776#4 0x00483a81 in PyEval_EvalCodeEx (co=0x2ab7daf8, globals=, locals=, args=0x0, argcount=0, kws=0x0, kwcount=0, defs=0x0, defcount=0, closure=0x0) at ceval.c:2832#5 0x00483ce2 in PyEval_EvalCode (co=, globals=, locals=) at ceval.c:494#6 0x004a52f7 in PyRun_FileExFlags (fp=0x654010, filename=0x7fc96546 "t.py", start=, globals=0x677070, locals=0x677070, closeit=1, flags=0x7fc95300) at pythonrun.c:1232#7 0x004a5612 in PyRun_SimpleFileExFlags (fp=, filename=0x7fc96546 "t.py", closeit=1, flags=0x7fc95300) at pythonrun.c:856#8 0x00411cbd in Py_Main (argc=, argv=0x7fc95418) at main.c:494#9 0x2b0515aa in __libc_start_main () from /lib64/tls/libc.so.6#10 0x004112ba in _start () at start.S:113 ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] a note in random.shuffle.__doc__ ...
Alex Martelli wrote: > ...claims: > > Note that for even rather small len(x), the total number of > permutations of x is larger than the period of most random number > generators; this implies that "most" permutations of a long > sequence can never be generated. > > Now -- why would the behavior of "most" random number generators be > relevant here? The module's docs claim, for its specific Mersenne > Twister generator, a period of 2**19997-1, which is (e.g.) a > comfortable > 130128673800676351960752618754658780303412233749552410245124492452914636 > 028095467780746435724876612802011164778042889281426609505759158196749438 > 742986040468247017174321241233929215223326801091468184945617565998894057 > 859403269022650639413550466514556014961826309062543 times larger than > the number of permutations of 2000 items, which doesn't really feel > to me like a "rather small len(x)" in this context (what I'm most > often shuffling is just a pack of cards -- len(x)==52 -- for example). I wouldn't be too comfortable with that margin. The fun thing about factorials is that they add up really quickly. The crossover point is between 2080 and 2081. In [28]: from scipy import * In [29]: def f(x): : return special.gammaln(x-1) - 19937*log(2) : In [30]: optimize.brentq(f, 2000, 3000) Out[30]: 2082.4031300820125 In [31]: import gmpy In [32]: mtperiod = 2**19937 - 1 In [33]: for i in range(2075, 2085): : if gmpy.fac(i) > mtperiod: : print i : break : : 2081 I think that documenting this boundary might be worthwhile rather than making vague references to "small len(x)." A note along the lines of Josiah wrote about there being no guarantees despite period size would also be useful. OTOH, isn't the exact PRNG algorithm considered an implementation detail? It certainly was when the module migrated from Wichmann-Hill to the Mersenne Twister. OTGH, I don't foresee the random module ever using an algorithm with worse characteristics than the Mersenne Twister. -- Robert Kern "I have come to believe that the whole world is an enigma, a harmless enigma that is made terrible by our own mad attempt to interpret it as though it had an underlying truth." -- Umberto Eco ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] a note in random.shuffle.__doc__ ...
[Alex Martelli] > ...claims: > > Note that for even rather small len(x), the total number of > permutations of x is larger than the period of most random number > generators; this implies that "most" permutations of a long > sequence can never be generated. > > Now -- why would the behavior of "most" random number generators be > relevant here? The module's docs claim, for its specific Mersenne > Twister generator, a period of 2**19997-1, which is (e.g.) Oops! That's wrong. The period is 2**19937-1. > a comfortable > 130128673800676351960752618754658780303412233749552410245124492452914636 > 028095467780746435724876612802011164778042889281426609505759158196749438 > 742986040468247017174321241233929215223326801091468184945617565998894057 > 859403269022650639413550466514556014961826309062543 times larger than > the number of permutations of 2000 items, which doesn't really feel > to me like a "rather small len(x)" in this context (what I'm most > often shuffling is just a pack of cards -- len(x)==52 -- for example). > > I suspect that the note is just a fossil from a time when the default > random number generator was Whichman-Hill, with a much shorter > period. Should this note just be removed, or instead somehow > reworded to point out that this is not in fact a problem for the > module's current default random number generator? Opinions welcome! It should be removed now. I'll do that :-) WH's period was indeed so short that it couldn't generate even a tiny fraction of the permutations of a deck of cards, and that's why the note was added. While a long period is necessary to get a shot at all permutations, it's not sufficient, and I don't know what the true story is wrt the Twister. For example, a miserable PRNG that returns 0.1, 0.1, 0.2, 0.1, 0.2, 0.2, 0.1, 0.2, 0.2, 0.2, 0.1, 0.2, 0.2, 0.2, 0.2, ... has infinite period, but has few (O(N)) distinct subsequences of length N. That's a failure of so-called equidistribution in N dimensions (for sufficiently large N, some N-vectors appear more often than others across the whole period). "A long" period is necessary but not sufficient for high-dimensional equidistribution. Off the top of my head, then, since the Twister is provably equidistributed in 623 dimensions to 32-bit accuracy, I expect it should be able to "fairly" generate all permutations of a sequence of <= 623 elements (equidistribution in N dimensions implies equidistribution in all dimensions <= N). So I'm happy to leave a warning out until the casinos switch to 12-deck blackjack ;-) ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] a note in random.shuffle.__doc__ ...
On Jun 10, 2006, at 1:08 PM, Josiah Carlson wrote: > Josiah Carlson <[EMAIL PROTECTED]> wrote: >> >> Alex Martelli <[EMAIL PROTECTED]> wrote: >>> >>> ...claims: >>> >>> Note that for even rather small len(x), the total number of >>> permutations of x is larger than the period of most random number >>> generators; this implies that "most" permutations of a long >>> sequence can never be generated. >> [snip] >>> I suspect that the note is just a fossil from a time when the >>> default >>> random number generator was Whichman-Hill, with a much shorter >>> period. Should this note just be removed, or instead somehow >>> reworded to point out that this is not in fact a problem for the >>> module's current default random number generator? Opinions welcome! >> >> I'm recovering from a migraine, but here are my thoughts on the >> topic... >> >> The number of permutations of n items is n!, which is > (n/2)^(n/2). >> Solve: 2**19997 < (n/2)^(n/2) >> log_2(2**19997) < log_2((n/2)^(n/2)) >> 19997 < (n/2)*log(n/2) >> >> Certainly with n >= 4096, the above holds (2048 * 11 = 22528) >> >> - Josiah > > I would also point out that even if MT had a larger period, there > would > still be no guarantee that all permutations of a given sequence > would be > able to be generated from the PRNG given some aribtrary internal > state. Sure. And an n of 2081 happens to suffice: >>> period = 2**19937 >>> while gmpy.fac(i) < period: i = i +1 ... >>> i 2081 Still, the note, as worded, is misleading -- it strongly suggests that for "even small len(x)" (no mention of whether that means dozens or thousands) the RNG can't generate all permutations, with no proof either way and just a misleading hint. "The values of N such that the RNG can generate all permutations of a sequence of len(N) are not precisely known at this time" might be closer to the truth (if this is, indeed, the state of our collective knowledge). Alex ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] a note in random.shuffle.__doc__ ...
That doc note should surely be removed. Perhaps it's an artifact from some earlier shuffle algorithm. The current algorithm (which is simple, well known, and which produces all permutations with equal probability) only calls the RNG len(x) - 1 times. Terry ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] beta1 coming real soon
Barry Warsaw wrote: > On Fri, 9 Jun 2006 09:54:29 -0700 > "Brett Cannon" <[EMAIL PROTECTED]> wrote: > >> Do enough people use Google Calendar or a calendar app that support >> iCal feeds that it would be useful for someone to maintain a Gcal >> calendar that has the various Python dev related dates in it? > > Great idea! Won't help myself too much - I use a sheet of paper on the wall as a calendar. Thomas ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
[Python-Dev] Add pure python PNG writer module to stdlib?
I'm working on simple module to write PNG image files in pure python. Adding it to the standard library would be useful for people who want to create images on web server installations without gd and imlib, or on platforms where the netpbm tools are not easily available. Does anybody find this idea interesting? Does anybody think it could go into stdlib before the feature freeze for 2.5? The module consists of only one file. It imports only sys, zlib, struct (maybe re for testing). Some benchmarks for comparison with the pnmtopng program (from netpbm), encoding a plain RGB file with 24 bits per pixel, input file size 11520017 bytes (11M), measured with the 'time' command, including Python interpreter start-up: pnmtopngpng.py straight encoding 1.31 seconds0.72 seconds resulting file size 342953 bytes292885 bytes interlaced encoding 3.78 seconds4.88 seconds resulting file size 422441 bytes346872 bytes The source code of the module lives here: http://svn.browsershots.org/trunk/shotfactory/lib/image/png.py http://trac.browsershots.org/browser/trunk/shotfactory/lib/image/png.py I am willing to maintain the module for 5+ years, as it is a small but important part of my main project. I am also willing to write latex documentation and tests for the module, and I think I could do that within the next three days. The module is licensed under the Apache License 2.0, and I am ready to sign a contributor agreement for the PSF. I will probably add support for more different PNG formats, especially alpha channel transparency, and then maybe color palettes. I don't plan to add PNG decoding because it would make the module much larger and rather complex. Sorry if this contribution seems brash. Perhaps it is easy enough to download and deploy my module separately. But I thought that if there is a chance to get it in before beta1, I should not hesitate and just ask. Cheers, Johann ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] Add pure python PNG writer module to stdlib?
Johann C. Rocholl wrote: > I'm working on simple module to write PNG image files in pure python. > Adding it to the standard library would be useful for people who want > to create images on web server installations without gd and imlib, or > on platforms where the netpbm tools are not easily available. > > Does anybody find this idea interesting? > Does anybody think it could go into stdlib before the feature freeze for 2.5? > > +1 Michael Foord > The module consists of only one file. It imports only sys, zlib, > struct (maybe re for testing). > Some benchmarks for comparison with the pnmtopng program (from > netpbm), encoding a plain RGB file with 24 bits per pixel, input file > size 11520017 bytes (11M), measured with the 'time' command, including > Python interpreter start-up: > pnmtopngpng.py > straight encoding 1.31 seconds0.72 seconds > resulting file size 342953 bytes292885 bytes > interlaced encoding 3.78 seconds4.88 seconds > resulting file size 422441 bytes346872 bytes > > The source code of the module lives here: > http://svn.browsershots.org/trunk/shotfactory/lib/image/png.py > http://trac.browsershots.org/browser/trunk/shotfactory/lib/image/png.py > > I am willing to maintain the module for 5+ years, as it is a small but > important part of my main project. I am also willing to write latex > documentation and tests for the module, and I think I could do that > within the next three days. The module is licensed under the Apache > License 2.0, and I am ready to sign a contributor agreement for the > PSF. > > I will probably add support for more different PNG formats, especially > alpha channel transparency, and then maybe color palettes. I don't > plan to add PNG decoding because it would make the module much larger > and rather complex. > > Sorry if this contribution seems brash. Perhaps it is easy enough to > download and deploy my module separately. But I thought that if there > is a chance to get it in before beta1, I should not hesitate and just > ask. > > Cheers, > Johann > ___ > Python-Dev mailing list > [email protected] > http://mail.python.org/mailman/listinfo/python-dev > Unsubscribe: > http://mail.python.org/mailman/options/python-dev/fuzzyman%40voidspace.org.uk > > ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] a note in random.shuffle.__doc__ ...
[Terry Jones] > That doc note should surely be removed. Perhaps it's an artifact from some > earlier shuffle algorithm. No, it's an artifact form an earlier PRNG. The shuffle algorithm hasn't changed. > The current algorithm (which is simple, well known, Both true. > and which produces all permutations with equal probability) That needs proof. Assuming a true random number generator, such a proof is easy. Using a deterministic PRNG, if the period is "too short" it's dead easy (see below) to prove that it can't produce all permutations (let alone with equal probablility). > only calls the RNG len(x) - 1 times. And that's irrelevant. When a PRNG has period P, then _no_ deterministic algorithm (for shuffling or anything else) using that PRNG can possibly produce more than P distinct outcomes: the position in the period when you start the algorithm entirely determines the outcome, and there are only P _possible_ starting positions. For the older WH PRNG, P was much smaller than 52!, so it was just that easy to _know_ that not all deck-of-card shufflings could be produced. The newer Mersenne Twister PRNG has a vastly larger period, and more to the point has provably excellent equidistribution properties in 52 dimensions. ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] Switch statement
Thomas> As the subject of this e-mail says, the attached patch adds a
Thomas> "switch" statement to the Python language.
Thanks for the contribution. I patched my sandbox and it built just fine.
I'm going out of town for a couple weeks, so I'll point out what everyone
else is thinking then duck out of the way:
* Aside from the modified Grammar file there is no documentation.
* There are no test cases.
* Can you submit a patch on SourceForge?
Other than that, my trivial first attempt worked fine:
#!/usr/bin/env python
switch raw_input("enter a, b or c: "):
case 'a':
print 'yay! an a!'
case 'b':
print 'yay! a b!'
case 'c':
print 'yay! a c!'
else:
print 'hey dummy! I said a, b or c!'
(Need to teach python-mode about the switch and case keywords.)
You mentioned:
Thomas> I got a bit lost as to why the SWITCH opcode is necessary for
Thomas> the implementation of the PEP. The reasoning seems to be
Thomas> improving performance, but I'm not sure how a new opcode could
Thomas> improve performance.
Your implementation is straightforward, but uses a series of DUP_TOP and
COMPARE_OP instructions to compare each alternative expression to the
initial expression. In many other languages the expression associated with
the case would be restricted to be a constant expression so that at compile
time a jump table or dictionary lookup could be used to jump straight to the
desired case.
Skip
___
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] a note in random.shuffle.__doc__ ...
> "Tim" == Tim Peters <[EMAIL PROTECTED]> writes: Tim> [Terry Jones] >> and which produces all permutations with equal probability) Tim> That needs proof. Assuming a true random number generator, such a Tim> proof is easy. Using a deterministic PRNG, if the period is "too Tim> short" it's dead easy (see below) to prove that it can't produce all Tim> permutations (let alone with equal probablility). OK, thanks. Sorry for the noise. Terry ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] Add pure python PNG writer module to stdlib?
On 6/10/06, Johann C. Rocholl <[EMAIL PROTECTED]> wrote: I'm working on simple module to write PNG image files in pure python.Adding it to the standard library would be useful for people who wantto create images on web server installations without gd and imlib, oron platforms where the netpbm tools are not easily available. Does anybody find this idea interesting?Yes, although I wouldn't want an interface taking in strings but something more like an iterator that returns each row which itself contains int triples. In other words more array-based than string based. Does anybody think it could go into stdlib before the feature freeze for 2.5? Nope. To get added to the stdlib there needs to be support from the community that the module is useful and best-of-breed. Try posting on c.l.py and see if people pick it up and like it. No way that is going to happen before b1. But there is always 2.6 .-Brett The module consists of only one file. It imports only sys, zlib, struct (maybe re for testing).Some benchmarks for comparison with the pnmtopng program (fromnetpbm), encoding a plain RGB file with 24 bits per pixel, input filesize 11520017 bytes (11M), measured with the 'time' command, including Python interpreter start-up:pnmtopngpng.pystraight encoding 1.31 seconds0.72 secondsresulting file size 342953 bytes292885 bytesinterlaced encoding 3.78 seconds4.88 secondsresulting file size 422441 bytes346872 bytesThe source code of the module lives here:http://svn.browsershots.org/trunk/shotfactory/lib/image/png.py http://trac.browsershots.org/browser/trunk/shotfactory/lib/image/png.pyI am willing to maintain the module for 5+ years, as it is a small but important part of my main project. I am also willing to write latexdocumentation and tests for the module, and I think I could do thatwithin the next three days. The module is licensed under the ApacheLicense 2.0, and I am ready to sign a contributor agreement for thePSF.I will probably add support for more different PNG formats, especiallyalpha channel transparency, and then maybe color palettes. I don'tplan to add PNG decoding because it would make the module much larger and rather complex.Sorry if this contribution seems brash. Perhaps it is easy enough todownload and deploy my module separately. But I thought that if thereis a chance to get it in before beta1, I should not hesitate and just ask.Cheers,Johann___Python-Dev mailing [email protected] http://mail.python.org/mailman/listinfo/python-devUnsubscribe: http://mail.python.org/mailman/options/python-dev/brett%40python.org ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] a note in random.shuffle.__doc__ ...
Robert Kern wrote: > OTOH, isn't the exact PRNG algorithm considered an implementation detail? It's questionable whether the PRNG being used *should* be an implementation detail. To anyone who cares even a little bit about its quality, knowing the algorithm (or at least some info about it, such as the period) is vital. PRNGs are not like sorting algorithms, where different ones all give the same result in the end. Different PRNGs have *wildly* different characteristics. -- Greg ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] a note in random.shuffle.__doc__ ...
Tim Peters wrote: > Off the top of my head, then, since the Twister is provably > equidistributed in 623 dimensions to 32-bit accuracy, I expect it > should be able to "fairly" generate all permutations of a sequence of > <= 623 elements (equidistribution in N dimensions implies > equidistribution in all dimensions <= N). So I'm happy to leave a > warning out until the casinos switch to 12-deck blackjack ;-) But isn't the problem with the Twister that for *some initial states* the period could be much *shorter* than the theoretical maximum? Or is the probability of getting such an initial state too small to worry about? -- Greg ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] a note in random.shuffle.__doc__ ...
Terry Jones wrote: > That doc note should surely be removed. Perhaps it's an artifact from some > earlier shuffle algorithm. > > The current algorithm (which is simple, well known, and which produces all > permutations with equal probability) only calls the RNG len(x) - 1 times. It's not a matter of how many times it's called, but of how much internal state it has. A generator with only N possible internal states can't possibly result in more than N different outcomes from any algorithm that uses its results. -- Greg ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] Switch statement
[EMAIL PROTECTED] wrote:
> switch raw_input("enter a, b or c: "):
> case 'a':
> print 'yay! an a!'
> case 'b':
> print 'yay! a b!'
> case 'c':
> print 'yay! a c!'
> else:
> print 'hey dummy! I said a, b or c!'
Before accepting this, we could do with some debate about the
syntax. It's not a priori clear that C-style switch/case is
the best thing to adopt.
--
Greg
___
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] Pre-PEP: Allow Empty Subscript List Without Parentheses
> > And from a syntax perspective, it's a bad idea. x[] is much > > more often a typo than an intentional attempt to index a > > zero-dimensional array. > > but how often is it a typo? > > for example, judging from c.l.python traffic, forgetting to add a return > statement is a quite common, but I haven't seen anyone arguing that we > deprecate the implied "return None" behaviour. Sounds like a terrific idea. The implicit None behaviour has hit me many times and: something = somefunc() is almost always an error if somefunc() doesn't have an explicit return statement. I don't know how difficult it is to get rid of the implicit "return None" or even if it is doable, but if it is, it should, IMHO, be done. -- mvh Björn ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] a note in random.shuffle.__doc__ ...
> "Greg" == Greg Ewing <[EMAIL PROTECTED]> writes: Greg> A generator with only N possible internal states can't Greg> possibly result in more than N different outcomes from Greg> any algorithm that uses its results. I don't mean to pick nits, but I do find this a bit too general. Suppose you have a RNG with a cycle length of 5. There's nothing to stop an algorithm from taking multiple already returned values and combining them in some (deterministic) way to generate > 5 outcomes. (Yes, those outcomes might be more, or less, predictable but that's not the point). If you expanded what you meant by "internal states" to include the state of the algorithm (as well as the state of the RNG), then I'd be more inclined to agree. Worse, if you have multiple threads / processes using the same RNG, the individual threads could exhibit _much_ more random behavior if individual thread outcomes depend on multiple RNG return values (as is the case with random.shuffle) and the scheduler is mixing things up. Here you'd have to include the state of the operating system to claim you can't get more outcomes than the number of internal states. But that's getting pretty far away from what we'd ordinarily think of as the internal state of the RNG. Terry ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] Switch statement
Greg> Before accepting this, we could do with some debate about the Greg> syntax. It's not a priori clear that C-style switch/case is the Greg> best thing to adopt. Oh sure. That debate should probably leverage PEP 275. Skip ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] Add pure python PNG writer module to stdlib?
On Jun 10, 2006, at 4:35 PM, Brett Cannon wrote:On 6/10/06, Johann C. Rocholl <[EMAIL PROTECTED]> wrote: I'm working on simple module to write PNG image files in pure python.Adding it to the standard library would be useful for people who wantto create images on web server installations without gd and imlib, oron platforms where the netpbm tools are not easily available. Does anybody find this idea interesting?Yes, although I wouldn't want an interface taking in strings but something more like an iterator that returns each row which itself contains int triples. In other words more array-based than string based. Well you could easily make such strings (or a buffer object that could probably be used in place of a string) with the array module... -bob___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] Switch statement
On Sat, Jun 10, 2006 at 05:53:14PM -0500, [EMAIL PROTECTED] wrote: > * Aside from the modified Grammar file there is no documentation. > * There are no test cases. > * Can you submit a patch on SourceForge? All have been addressed, although I'm not sure if I've covered everywhere I need to update for the documentation: http://sourceforge.net/tracker/index.php?func=detail&aid=1504199&group_id=5470&atid=305470 Thanks again for your feedback! Cheers, Tom -- Tom Lee http://www.vector-seven.com ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] a note in random.shuffle.__doc__ ...
[Greg Ewing] > But isn't the problem with the Twister that for *some > initial states* the period could be much *shorter* than > the theoretical maximum? > > Or is the probability of getting such an initial state > too small to worry about? The Twister's state is held in a vector of 624 32-bit words. 31 of the bits aren't actually used, and the number of meaningful state bits is actually 624 * 32 - 31 = 19937. There are exactly 2 orbits in the state space under the state transformation operation (STO): 1. A trivial orbit of length 1, consisting of the state in which all meaningful bits are 0. That's a fixed point for the STO. There are no other fixed points. 2. All not-entirely-0 states are in the other orbit, of length 2**19937 - 1. All not-0 states are reachable from all other not-0 states, and you get back to the non-zero state you start from for the first time after exactly 2**19937 - 1 iterations of the STO. So as long as you don't start with the all-0 state, you're in the second orbit, and see the advertised period (2**19937 - 1). >From Python code, it's impossible to get the all-0 state. All Python-visible initialization methods guarantee there's at least one bit set in the meaningful bits of the state vector, so the probability of not seeing a period of 2**19937 - 1 from Python is exactly 0. Hmm. Well, there _is_ a way to screw yourself here, but you have to work at it: you can force the all-0 state by hand-crafting the right input to random.setstate(). ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] Pre-PEP: Allow Empty Subscript List Without Parentheses
Noam Raphael wrote: > I hope that my (hopefully) better explanation made the use case more > compelling, but I want to add two points in favour of an empty tuple: I guess I'm really only -0 on the idea of x[] invoking x.__getitem__(), and allowing the class to decide whether or not to define a default value for the subscript. I wouldn't implement it myself, but I wouldn't object strenuously if Guido decided it was OK :) For your specific use cases, though, I'd be inclined to tweak the API a bit, and switch to using attributes for the single-valued data: tax_rates.income_tax = 0.18 Although the income tax rate should actually depend on the current financial year, since it can change over time as the government increases taxes ;) > Why? Mental exercise is a good way to keep you mental ;) Hehe :) Cheers, Nick. -- Nick Coghlan | [EMAIL PROTECTED] | Brisbane, Australia --- http://www.boredomandlaziness.org ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] Add pure python PNG writer module to stdlib?
> > Does anybody find this idea interesting?
>
> Yes, although I wouldn't want an interface taking in strings but something
> more like an iterator that returns each row which itself contains int
> triples. In other words more array-based than string based.
I agree that arrays would be semantically closer to the concept of
scanlines of pixel values. OTOH, I have my reasons for choosing the
string interface:
1. String is what you get from any file-like object with file.read(),
be it a PPM file on disk, or a pipe like this: os.popen('djpeg
test.jpg')
2. String is unbeatable in terms of efficiency.
3. Everybody knows how to use strings.
4. String can easily be created from other representations, for example:
>>> from array import array
>>> B = array('B')
>>> B.extend((255, 255, 255))
>>> B.tostring()
'\xff\xff\xff'
> > Does anybody think it could go into stdlib before the feature freeze for
> 2.5?
>
> Nope. To get added to the stdlib there needs to be support from the
> community that the module is useful and best-of-breed. Try posting on
> c.l.py and see if people pick it up and like it. No way that is going to
> happen before b1. But there is always 2.6 .
That's what I thought. My remote hope was that there would be
immediate concensus on python-dev about both the 'useful' and
'best-of-breed' parts. Anybody else with a +1? ;-)
Seriously, it's totally fine with me if the module doesn't make it
into 2.5, or even if it never makes it into stdlib. I'm just offering
it with some enthusiasm.
Cheers,
Johann
___
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] 2.5 issues need resolving in a few days
Fred L. Drake, Jr. wrote: > On Saturday 10 June 2006 12:34, Fredrik Lundh wrote: > > if all undocumented modules had as much documentation and articles as > > ET, the world would be a lot better documented ;-) > > > > I've posted a text version of the xml.etree.ElementTree PythonDoc here: > > Here's a question that we should answer before the beta: > > With the introduction of the xmlcore package in Python 2.5, should we > document > xml.etree or xmlcore.etree? If someone installs PyXML with Python 2.5, I > don't think they're going to get xml.etree, which will be really confusing. > We can be sure that xmlcore.etree will be there. > > I'd rather not propogate the pain caused "xml" package insanity any further. +1 for 'xmlcore.etree'. I don't use XML very much, and it was thoroughly confusing to find that published XML related code didn't work on my machine, even though the stdlib claimed to provide an 'xml' module (naturally, the published code needed the full version of PyXML, but I didn't know that at the time). Cheers, Nick. -- Nick Coghlan | [EMAIL PROTECTED] | Brisbane, Australia --- http://www.boredomandlaziness.org ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] Segmentation fault in collections.defaultdict
Kevin Jacobs <[EMAIL PROTECTED]> wrote: > Try this at home: > import collections > d=collections.defaultdict(int) > d.iterkeys().next() # Seg fault > d.iteritems().next() # Seg fault > d.itervalues().next() # Fine and dandy This all worked fine for me in rev 46739 and 46849 (Kubuntu 6.06, gcc 4.0.3). > Python version: > Python 2.5a2 (trunk:46822M, Jun 10 2006, 13:14:15) > [GCC 4.0.2 20050901 (prerelease) (SUSE Linux)] on linux2 Either something got broken and then fixed again between the two revs I tried, there's a problem specific to GCC 4.0.2, or there's a problem with whatever local modifications you have in your working copy :) Cheers, Nick. -- Nick Coghlan | [EMAIL PROTECTED] | Brisbane, Australia --- http://www.boredomandlaziness.org ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
Re: [Python-Dev] Segmentation fault in collections.defaultdict
Nick Coghlan wrote: > Kevin Jacobs <[EMAIL PROTECTED]> wrote: >> Try this at home: >> import collections >> d=collections.defaultdict(int) >> d.iterkeys().next() # Seg fault >> d.iteritems().next() # Seg fault >> d.itervalues().next() # Fine and dandy > > This all worked fine for me in rev 46739 and 46849 (Kubuntu 6.06, gcc 4.0.3). > >> Python version: >> Python 2.5a2 (trunk:46822M, Jun 10 2006, 13:14:15) >> [GCC 4.0.2 20050901 (prerelease) (SUSE Linux)] on linux2 > > Either something got broken and then fixed again between the two revs I > tried, > there's a problem specific to GCC 4.0.2, or there's a problem with whatever > local modifications you have in your working copy :) Same here. I tried with the same revision as Kevin, and got no segfault at all (using GCC 4.1.1 on Linux). Note that "GCC 4.0.2 20050901 (prerelease)" sound like something that's not really been thoroughly tested ;) Georg ___ Python-Dev mailing list [email protected] http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
