[Tutor] Weird import problem with PythonIDE on Mac (was 'import problem')
Feziwe Mpondo
feziwe at sanbi.ac.za
Tue May 3 16:42:29 CEST 2005
Chris Smith wrote:
>
> On Friday, Apr 22, 2005, at 10:00 America/Chicago, Max Noel wrote:
>
>>
>>> Do you have a suggestion as to what can I give a module so it has
>>> enough information to execute a function that resides in __main__?
>>> Here is a visual of what is going on:
>>>
>>> ------__main__
>>> def y1():
>>> pass
>>> import foo
>>> foo.run(string_from_main) #what should I pass?
>>>
>>> ------external module, foo
>>>
>>> def run(string_from_main):
>>> #
>>> exec(string_from_main) #y1 is run as if it were in __main__
>>>
>>>
>>> /c
>>
>>
>> Python makes it easy to do because functions (and classes) are
>> objects. Here:
>>
>> # in __main__
>> def y1():
>> pass
>> import foo
>> foo.run(y1)
>>
>>
>> # in foo
>> def run(functionFromMain):
>> functionFromMain()
>>
>
> Yes, I know about this, but this is not the problem. The problem is
> knowing what *strings* to pass to the timeit module so it can access a
> function that is written in one's __main__. Basically, the timeit
> module uses a template to construct a function which is (in the timeit
> module) compiled and then executed. You get to send two strings: an
> initialization string that is run once and the code string that
> appears in a loop. Here, for example, is the function that is
> reconstructed and run without success (in mac's pythonIDE:
>
> ###
> def inner(_it, _timer):
> from __main__ import y1 # I supplied this
> _t0 = _timer()
> for _i in _it:
> y1() # and I supplied this
> _t1 = _timer()
> return _t1 - _t0
> ###
>
> The way the IDE works, this import fails. There are two ways I have
> found around the problem:
>
> 1) wrap the functions of __main__ into a triple quoted string and then
> parsing it apart and sending it to timeit (not too elegant/pythonic):
>
> ### brute force passing of function to timeit
> funcs='''
>
> def y1():
> print 'y1 executed'
>
> def y2():
> print 'y2 executed'
> '''
>
> for f in funcs.split('def'):
> f = f.strip()
> if not f:
> continue
> name = f.split('(')[0]
> t=timeit.Timer('def '+f)
> print name,t.timeit(1)
> ###
>
> 2) the other approach is to add an additional argument to the timeit
> __init__ that accepts globals() from the calling program:
>
> ###
> def __init__(self, stmt="pass", setup="pass", timer=default_timer,
> glbls = globals):
> """Constructor. See class doc string.""" # changed
> here - -^
> self.timer = timer
> stmt = reindent(stmt, 8)
> setup = reindent(setup, 4)
> src = template % {'stmt': stmt, 'setup': setup}
> self.src = src # Save for traceback display
> code = compile(src, dummy_src_name, "exec")
> ns = {}
> exec code in glbls, ns # and here
> self.inner = ns["inner"]
> ###
>
> Then __main__ can send functions like this:
>
> ###
> def y1():
> print 'y1 executed'
> def y2():
> print 'y2 executed'
> for f in [y1,y2]:
> func = f.__name__
> t=timeit.Timer(stmt = "%s()" % func, glbls = globals())
> print func, t.timeit(1)
> ###
>
> {If you read to here, thanks. Is there a better way to accomplish
> this with the current timeit module without modifying timeit? i.e. is
> there another way to pass the needed information as a string that
> timeit's created function can execute?}
>
> /c
>
> _______________________________________________
> Tutor maillist - Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor
hello
problem : question says modify a guessing program and to keep track of
how many times the user has entered the password wrong. if it more than
3 times, print "that must have bin though"
More information about the Tutor
mailing list