当前位置: 首页 > 面试题库 >

python中的功能管道,例如R的magritrr中的%>%

澹台镜
2023-03-14
问题内容

在R中(感谢magritrr),您现在可以通过通过更实用的管道语法执行操作%>%。这意味着无需编码:

> as.Date("2014-01-01")
> as.character((sqrt(12)^2)

您也可以这样做:

> "2014-01-01" %>% as.Date 
> 12 %>% sqrt %>% .^2 %>% as.character

对我来说,这更具可读性,并且扩展到数据框之外的用例。python语言是否支持类似功能?


问题答案:

一种可行的方法是使用名为的模块macropy。Macropy允许您将转换应用于所编写的代码。因此a | b可以转换为b(a)。这具有许多优点和缺点。

与Sylvain Leroux提到的解决方案相比,主要优点是您不需要为要使用的功能创建中缀对象-
只需标记要使用转换的代码区域即可。其次,由于转换是在编译时而不是在运行时应用的,因此转换后的代码在运行时不会受到开销-
所有工作都是在最初从源代码生成字节代码时完成的。

主要缺点是,宏需要某种特定的激活方式才能起作用(稍后会提到)。与更快的运行时间相比,源代码的解析在计算上更加复杂,因此程序将需要更长的启动时间。最后,它添加了一种语法样式,这意味着不熟悉宏的程序员可能会发现您的代码更难理解。

运行

import macropy.activate 
# Activates macropy, modules using macropy cannot be imported before this statement
# in the program.
import target
# import the module using macropy

target.py

from fpipe import macros, fpipe
from macropy.quick_lambda import macros, f
# The `from module import macros, ...` must be used for macropy to know which 
# macros it should apply to your code.
# Here two macros have been imported `fpipe`, which does what you want
# and `f` which provides a quicker way to write lambdas.

from math import sqrt

# Using the fpipe macro in a single expression.
# The code between the square braces is interpreted as - str(sqrt(12))
print fpipe[12 | sqrt | str] # prints 3.46410161514

# using a decorator
# All code within the function is examined for `x | y` constructs.
x = 1 # global variable
@fpipe
def sum_range_then_square():
    "expected value (1 + 2 + 3)**2 -> 36"
    y = 4 # local variable
    return range(x, y) | sum | f[_**2]
    # `f[_**2]` is macropy syntax for -- `lambda x: x**2`, which would also work here

print sum_range_then_square() # prints 36

# using a with block.
# same as a decorator, but for limited blocks.
with fpipe:
    print range(4) | sum # prints 6
    print 'a b c' | f[_.split()] # prints ['a', 'b', 'c']

最后是完成工作的模块。我称它为功能管道的fpipe,是它的模拟shell语法,用于将输出从一个进程传递到另一个进程。

fpipe.py

from macropy.core.macros import *
from macropy.core.quotes import macros, q, ast

macros = Macros()

@macros.decorator
@macros.block
@macros.expr
def fpipe(tree, **kw):

    @Walker
    def pipe_search(tree, stop, **kw):
        """Search code for bitwise or operators and transform `a | b` to `b(a)`."""
        if isinstance(tree, BinOp) and isinstance(tree.op, BitOr):
            operand = tree.left
            function = tree.right
            newtree = q[ast[function](ast[operand])]
            return newtree

    return pipe_search.recurse(tree)


 类似资料:
  • 本文向大家介绍Python multiprocessing模块中的Pipe管道使用实例,包括了Python multiprocessing模块中的Pipe管道使用实例的使用技巧和注意事项,需要的朋友参考一下 multiprocessing.Pipe([duplex]) 返回2个连接对象(conn1, conn2),代表管道的两端,默认是双向通信.如果duplex=False,conn1只能用来接收

  • 问题内容: 有没有一种方法可以从Python内部获得类似于Shell上的功能。我正在寻找系统调用以外的解决方案。我确定代码少于20行,并且我想知道是否有人已经编写了它? 问题答案: 对于,请使用: 该参数是在Python 3.5中添加的。 对于Python≥3.2,os.makedirs具有可选的第三个参数exist_ok,当时,启用功能,除非 提供了该参数,并且现有目录具有与预期目录不同的权限;

  • 问题内容: 我有一个Python脚本,有时会向用户显示图像。图像有时可能很大,并且经常重复使用。显示它们不是关键,但显示与它们关联的消息是至关重要的。我有一个功能,可以下载所需的图像并将其保存在本地。现在,它与向用户显示消息的代码内联运行,但是对于非本地图像,有时可能会花费10秒钟以上。有没有一种方法可以在需要时调用此函数,但是在代码继续执行的同时在后台运行?我只会使用默认图像,直到正确的图像可用

  • 问题内容: 我在全局管道库的目录中定义了全局函数。我总是被造成的。我将其替换为,现在得到了类似的由引起的执行。我找不到任何有关如何处理全局函数中的序列化问题的文档。不起作用。我在目录中创建了一个文件名,并添加了以下代码: 我总是会收到此错误: 有什么方法可以处理全局函数中的序列化问题? 问题答案: 我通过替换为解决了问题

  • 问题内容: 我在用另一个功能替换另一个模块中的功能时遇到麻烦,这让我发疯。 假设我有一个看起来像这样的模块bar.py: 我还有另一个看起来像这样的模块: 我希望得到结果: 但是我得到了这个: 我究竟做错了什么? 问题答案: 考虑一下Python名称空间的工作原理可能会有所帮助:它们实际上是字典。因此,当您执行此操作时: 这样想: 希望您能明白为什么它不起作用:-)将名称导入名称空间后, 从中 导

  • 在seborn lmmap函数中,我们有一个色调参数,它会自动在右侧绘制一个颜色条。如何禁用/删除颜色条? 下面是一个将生成颜色条的示例代码 我试图调用颜色条对象并将其删除。在传统的matplotlib方式中,我们可以使用 但我看不出它对lmplot有什么作用。另一种替代方式是sns。热图函数,其中提供cbar参数 但在lmplot中,没有cbar选项。在lmplot中,最好的方法是什么?