帮酷LOGO
  • 显示原文与译文双语对照的内容
文章标签:文件  cod  SIN  
Convert any Python file into a single line of code.

  • 源代码名称:onelinerizer
  • 源代码网址:http://www.github.com/csvoss/onelinerizer
  • onelinerizer源代码文档
  • onelinerizer源代码下载
  • Git URL:
    git://www.github.com/csvoss/onelinerizer.git
  • Git Clone代码到本地:
    git clone http://www.github.com/csvoss/onelinerizer
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/csvoss/onelinerizer
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
  • oneliner-izer

    Build Status

    将任何 python 文件转换为具有相同功能的单个代码行。

    不允许换行符不允许使用任何分号,或者。

    onelinepy.herokuapp.com现场演示。

    演示在 PyCon 2016,和幻灯片。

    安装和使用

    $ git clone https://github.com/csvoss/onelinerizer
    $ cd onelinerizer
    $ python main.py target_file.py --debug
    $ python target_file_ol.py

    示例

    x =3y =4print (x < y <5)

    (lambda__builtin__: (lambda__print, __y, d: [[__print(d.x<d.y<5) for d.y in [(4)]][0] for d.x in [(3)]][0])(__builtin__.__dict__['print'],(lambdaf: (lambdax: x(x))(lambday: f(lambda*args: y(y)(*args)))),type('StateDict',(),__builtin__.__dict__)()))(__import__('__builtin__'))

    这一行看起来很复杂,因为我们需要一些技巧来导入打印功能,支持 whileif 等更复杂的特性。 但是,对于这样一个简单的程序,你可以认为它是以这种方式工作的:

    (lambdax: (lambday: print(x<y<5))(4))(3)

    deff(x):
     return x+5print f(13)

    (lambda__builtin__: (lambda__print, __y, d: [__print(d.f(13)) for d.f in [(lambdax:[(d.x+5) for d.x in [(x)]][0])]][0])(__builtin__.__dict__['print'],(lambdaf: (lambdax: x(x))(lambday: f(lambda*args: y(y)(*args)))),type('StateDict',(),__builtin__.__dict__)()))(__import__('__builtin__'))

    。或者,如果你想考虑更简化的事情:

    (lambdaf: print(f(13)))(lambdax: x+5)

    defguess_my_number(n):
     whileTrue:
     user_input =raw_input("Enter a positive integer to guess: ")
     iflen(user_input)==0ornot user_input.isdigit():
     print"Not a positive integer!"else:
     user_input =int(user_input)
     if user_input > n:
     print"Too big! Try again!"elif user_input < n:
     print"Too small! Try again!"else:
     print"You win!"returnTrueguess_my_number(42)

    (lambda__builtin__: (lambda__print, __y, d: [(lambda___: None)(d.guess_my_number(42)) for d.guess_my_number in [(lambdan:[(__y(lambda__this: (lambdad: (lambda__after: [(lambda__after: (lambda___: __after(d))(__print('Not a positive integer!')) if (d.len(d.user_input)==0or (not d.user_input.isdigit())) else [(lambda__after: (lambda___: __after(d))(__print('Too big! Try again!')) if d.user_input>d.n else (lambda__after: (lambda___: __after(d))(__print('Too small! Try again!')) if d.user_input<d.n else (lambda___: d.True)(__print('You win!')))(lambdad: __after(d)))(lambdad: __after(d)) for d.user_input in [(d.int(d.user_input))]][0])(lambdad: __this(d)) for d.user_input in [(d.raw_input('Enter a positive integer to guess: '))]][0] if d.Trueelse __after(d))(lambdad: None))))(d) for d.n in [(n)]][0])]][0])(__builtin__.__dict__['print'],(lambdaf: (lambdax: x(x))(lambday: f(lambda*args: y(y)(*args)))),type('StateDict',(),__builtin__.__dict__)()))(__import__('__builtin__'))

    常见问题解答

    哦天呐?

    对,对不起,但是另一方面,为什么不?

    不能使用分号?

    这将违背本练习的精神。 pass pass abuse lambda函数表达式列表理解,甚至偶尔出现的Y 组合? 永远不要放弃使用Y 组合器的机会。

    分析

    输出程序大小

    在输入代码的大小是线性的,所以一条代码是线性的,所以它是线性的。

    一行代码的运行时

    我没有理由相信产生的代码比原始代码慢得多。 由于时间循环,等等 是使用递归函数调用实现的,因这里为设置这些函数调用带来了更多开销。

    提示

    一个排列的代码往往包含许多嵌套的rtc ;如果有太多的话,python 将拒绝运行它。

    $ python main_ol.py
    s_push: parser stack overflow
    MemoryError

    使用pypy可以修复这里问题。

    $ pypy main_ol.py

    但是,由于循环和循环是用递归实现的,你可能会遇到 maximum recursion depth exceeded 如果循环继续长时间运行,则运行时出错。

    为了解决这个问题你可以

    import sys
    sys.setrecursionlimit(new_limit)

    在原始 python 代码中。 ( onelinerizer不会将这里命令放入你的位置。)

    不实现

    • 从foo导入 *

    打开问题

    • yield

    进一步阅读



    文章标签:文件  cod  SIN  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语