2010-06-30 65 views
1

这是合法的python ?.似乎工作...Expose __main__

感谢

# with these lines you not need global variables anymore 

if __name__ == '__main__': 
    import __main__ as main 
else: 
    main = __import__(os.path.basename(os.path.splitext(__file__))) 

var_in_main = 0 # now any var is a global var, you can access any var from everywhere 

def fun(*args, **kwargs): 

    self = fun 
    self.var_in_fun = 'I am a var into fun' 

    if args: 
     returnList = [] 
     for request in args: 
      returnList.append(getattr(self, request , 'Sorry, no var named "%s" into fun.' % request)) 

     if len(returnList) == 1: 
      return returnList[0] 
     else: 
      return returnList 

    elif kwargs: 
     for k,v in kwargs.iteritems(): 

      reset = kwargs.get('reset', None) 
      if reset: 
       main.var_in_main = 0 

      if k == 'times': 
       for i in range(v): 
        fun() 

      setattr(self, k, v) 

    else: # when no args or kwars, execute. 
     main.var_in_main += 1 
     print ' -', main.var_in_main 
     return self 


# testing 

print '\nSETTING AND GETTING VARS' 

print '  ', fun('var_in_fun') 
print '  ', fun('var_in_fun','erroneus_var_name') 
print '  ', fun('var_in_fun','erroneus_var_name')[0] 

fun(new_var_in_fun = fun) 

print '  ', fun('new_var_in_fun') 
print '  ', fun 

print '\nMULTIFUNCTION' 

fun()()()()  
fun() 
fun()()() 

print '\nRESET AND THEN LOOP' 

fun(reset = 1) 
fun(times = 3) 

print '\nRESET AND LOOP, IN ONE SHOT' 

fun(reset= 1, times = 100 ) 

输出

SETTING AND GETTING VARS 
     I am a var into fun 
     ['I am a var into fun', 'Sorry, no var named "erroneus_var_name" into fun.'] 
     I am a var into fun 
     <function fun at 0x44f930> 
     <function fun at 0x44f930> 

MULTIFUNCTION 
- 1 
- 2 
- 3 
- 4 
- 5 
- 6 
- 7 
- 8 

RESET AND THEN LOOP 
- 1 
- 2 
- 3 

RESET AND LOOP, IN ONE SHOT 
- 1 
- 2 
- 3 
- 4 
- 5 
- 6 
- 7 

    --- goes on and on ----- 

- 95 
- 96 
- 97 
- 98 
- 99 
- 100 
+0

那么,关键是要让全局变量没有标记出来呢?哇,这使得糟糕的做法更糟。 – 2011-11-20 14:09:18

回答

3
if __name__ == '__main__': 
    import __main__ as main 
else: 
    main = __import__(os.path.basename(os.path.splitext(__file__))) 

这是一个非常脆弱的方法,因为它依赖于相对进口行为,所有模块从包中。有一个更好的解决方案 - 更快,更简洁,更可靠:

import sys 
main = sys.modules[__name__] 

main的名称怪异的选择仍然是(当我使用这种方法,我通常使用类似thismodule),但所采取的办法绑定该名称现在是声音。

+0

显然这么干净,谢谢。 您如何看待'有趣'的'伪发电机'行为?,也许可能会有危险? – 2010-07-01 04:47:31

+0

@Javier,这是非常糟糕的风格(一个功能做很多不同的工作),因此很可能是越野车和难以维护,但副手,我没有看到一个特定的“危险”。 (如果我负责审查它,我永远不会批准那些奇怪的代码,但是;-)。无论如何,使用你所谓的'main'(我更愿意调用'thismodule')来代替'global'语句是一个单独的问题。 – 2010-07-01 05:13:09

相关问题