2014-09-20 74 views
-2

该代码检查系统是Windows还是Linux,导入所需的库并定义一个可用的“getch”函数。
但是...函数“_d”可以在lambda内完成吗?将函数转换为lambda表示

def _d(): 
    import sys, tty, termios 
    f = sys.stdin.fileno() 
    o = termios.tcgetattr(f) 
    try: 
     tty.setraw(sys.stdin.fileno()) 
     c = sys.stdin.read(1) 
    finally: 
     termios.tcsetattr(f, termios.TCSADRAIN, o) 
    return c 

_u = type('',(), { 
    '__init__': lambda s: setattr(s, '', (None for sys in [__import__('sys')] for tty in [__import__('tty')])), 
    '__call__': _d() 
}) 

_w = None if ImportError else __import__("msvcrt").getch() 

getch = (type('',(), { 
    '__init__': lambda s: setattr(s, 'i', _u()) if ImportError else setattr(s, 'i', _w()), 
    '__call__': lambda s: s.i() 
}))() 


我目前有:

setattr(type('',(),{}), '', (
    None for sys in [__import__('sys')] 
    for tty in [__import__('tty')] 
    for termios in [__import__('termios')] 
    for f in sys.stdin.fileno() 
    for o in termios.tcgetattr(f) 
    for _ in tty.setraw(sys.stdin.fileno()) 
    for c in sys.stdin.read(1) 
    for _ in termios.tcsetattr(f, termios.TCSADRAIN, o) 
)) 

但是,这并不让我回到 “C”。

+5

哇...为什么地球上做你想做的事是什么?另外,'lambda s:_d()'应该是'_d'。 – Veedrac 2014-09-20 00:59:56

+0

只是因为。 而thx,我改变了“_u .__ call__”中的代码后错过了那个。 – 2014-09-20 01:01:36

+3

这是一个非常非常糟糕的主意。钉不适合钻孔,好吗?请停止尝试将它塞入。你将打破该死的事情。 – 2014-09-20 01:08:22

回答

0

好吧,如果你必须:

lambda: exec(""" 
def _d(): 
    import sys, tty, termios 
    f = sys.stdin.fileno() 
    o = termios.tcgetattr(f) 
    try: 
     tty.setraw(sys.stdin.fileno()) 
     c = sys.stdin.read(1) 
    finally: 
     termios.tcsetattr(f, termios.TCSADRAIN, o) 
    return c 
""", globals()) or _d() 

似乎比其它更具可读性。


要解决您定的代码,虽然尝试:

lambda: next(
    c 
    for sys in [__import__('sys')] 
    for tty in [__import__('tty')] 
    for termios in [__import__('termios')] 
    for f in [sys.stdin.fileno()] 
    for o in [termios.tcgetattr(f)] 
    for _ in [tty.setraw(sys.stdin.fileno())] 
    for c in [sys.stdin.read(1)] 
    for _ in [termios.tcsetattr(f, termios.TCSADRAIN, o)] 
) 
+2

那么,“可读”不是我想要我的代码的东西。 – 2014-09-20 01:06:48

+1

@WilliamFernandes那么,最好使用Perl。在Python **可读性计数中。** – 2014-09-20 01:08:34

+0

@AshwiniChaudhary我试图让整个代码适合单个变量语句,以便在我的Python脚本中使用它。 – 2014-09-20 01:11:49