能否将Black作为API调用?

30

假设我想将 black 作为 API 使用,并执行以下操作:

import black

black.format("some python code")

通过调用Popen二进制文件使用black格式化代码是一种替代方案,但这不是我所要求的。


你可能需要使用Black文件。因为它基于代码解析语法,并考虑缩进等因素。你可以在这里查看代码 - han solo
blackd,但那可能比使用子进程还要糟糕。 - Arne
4个回答

26
你可以尝试使用format_str:
from black import format_str, FileMode
res = format_str("some python code", mode=FileMode())
print(res)

1
@laike9m 我不知道有没有,但是你可以看到如果你提供了 --code 命令行参数,它就是被使用的。链接 - Halvor Holsten Strand

6

不起作用,使最后一行。 输出 = black.format_file_contents( "ex_black.py", fast = True , mode = mode ) - russ_hensel
1
@russ_hensel 您需要传递Python模块的内容,而不是Python模块的路径。如果您想使用路径格式化,请使用format_file_in_place函数 - Oluwafemi Sule

2

虽然官方不支持, 但你可以像在black.format_stdin_to_stdout函数中看到的那样调用black.format_file_contents

简化后,只有以下几行:

import black  # version: 22.10.0

BLACK_MODE = black.Mode(target_versions={black.TargetVersion.PY311}, line_length=120)

code = ...  # some python code to reformat

try:
    code = black.format_file_contents(code, fast=False, mode=BLACK_MODE)
except black.NothingChanged:
    pass
finally:
    # Make sure there's a newline after the content
    if code and code[-1] != "\n":
        code += "\n"

print(code)  # print result

1
黑色是否有API?
目前还没有。Black基本上是一个命令行工具。它提供了许多集成,但Python接口不是其中之一。不过正在计划一个简单的API。
现在,您应该使用subprocess调用black。其他导入black的答案是不受支持的,并且可能会在没有警告的情况下出现错误。
请关注问题Black's public API #779以获取可能的进一步发展。
(来源:黑色FAQ页面中相同的问题)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接