Skip to main content

🦑 Beautifhy

A Hy beautifier / code formatter / pretty-printer / linter.

Probably compatible with Hy 1.0.0 and later.

Install

$ pip install -U beautifhy

The pygments style may be modified with the environment variable HY_PYGMENTS_STYLE. This sets the name of a pygments style to use for highlighting. Defaults to lightbulb.

Usage: pretty-printer and syntax highlighter

From the command line, to pretty-print the file core.hy:

$ beautifhy core.hy

gives the output

(import toolz [first second last])

(defmacro defmethod [#* args]
  "Define a multimethod (using multimethod.multimethod).
  For example, the Hy code

  `(defmethod f [#^ int x #^ float y]
    (// x (int y)))`

  is equivalent to the following Python code:

  `@multimethod
  def f(x: int, y: float):
      return await x // int(y)`

  You can also define an asynchronous multimethod:

  `(defmethod :async f [#* args #** kwargs]
    (await some-async-function #* args #** kwargs))`
  "
  (if (= :async (first args))
    (let [f (second args) body (cut args 2 None)]
      `(defn :async [hy.I.multimethod.multimethod] ~f ~@body))
    (let [f (first args) body (cut args 1 None)]
      `(defn [hy.I.multimethod.multimethod] ~f ~@body))))

(defn slurp [fname #** kwargs]
  "Read a file and return as a string.
  kwargs can include mode, encoding and buffering, and will be passed
  to open()."
  (let [f (if (:encoding kwargs None) hy.I.codecs.open open)]
    (with [o (f fname #** kwargs)]
      (o.read))))

(defmacro rest [xs]
  "A slice of all but the first element of a sequence."
  `(cut ~xs 1 None))

To apply syntax highlighting (no pretty-printing), do

$ hylight core.hy

You can use stdin and pipe by replacing the filename with -:

$ beautifhy core.hy | hylight -

which will pretty-print core.hy and then syntax highlight the output.

To convert python code to Hy (using py2hy), autoformat, then apply syntax highlighting, do

$ pip3 install py2hy
$ python3 -m py2hy some_code.py | beautifhy - | hylight -

Usage: linter

hylint checks Hy source for syntax errors and common issues.

$ hylint myfile.hy

With --style / -s, also runs opinionated style checks (camelCase names, missing docstrings, earmuff variables):

$ hylint --style myfile.hy

With --error-only / -e, only errors are shown (suppresses warnings and info):

$ hylint --error-only myfile.hy

Reads from stdin with -:

$ cat myfile.hy | hylint -

Exit code is 1 if any errors are found, 0 otherwise. Suitable for CI.

Lint rules (always on):

  • (defn f (x) ...) — use [] for parameter lists, not ()
  • (defn f [...] (do ...)) — remove redundant do
  • (fn [...] (do ...)) — remove redundant do
  • (when cond (do ...)) — remove redundant do
  • (if cond (do ...)) — use (when cond ...)
  • (do expr) — redundant single-expression do
  • (+ x 0), (* x 1) — identity arithmetic
  • (+ x 1) → (inc x), (- x 1) → (dec x) (from hyrule)

Style rules (--style):

  • camelCase function names — use kebab-case
  • Missing docstrings on defn/defmacro
  • Trailing commas in parameter lists
  • Earmuff variables (*var*) — use UPPER_SNAKE or kebab-case

Acknowledgements

The whole library uses pygments. The autoformatter relies on polymorphic dispatch provided by multimethod.

Docs

The docstrings are not bad. Otherwise, try clicking below.

Ask DeepWiki

Metadata

Release files for beautifhy 1.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for beautifhy 1.3.0
File Size Uploaded
beautifhy-1.3.0.tar.gz 21.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for beautifhy 1.3.0
File Interpreter ABI Platform
beautifhy-1.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 43.6 kB

Release files / beautifhy-1.3.0.tar.gz

Download URL beautifhy-1.3.0.tar.gz
Size 21.4 kB
Tags Source
SHA-256 checksum
How to use checksums
c10c0ca286f64e7bf51620fb621cc4a897e36da4913ac7a35f638f4db1934eaa
BLAKE2b-256 checksum
How to use checksums
b42108dd9cf1d1846e3dd0dab365873649b29c2f4245d3b249550a735c01af78
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.2

Release files / beautifhy-1.3.0-py3-none-any.whl

Download URL beautifhy-1.3.0-py3-none-any.whl
Size 22.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bae7f89d508766dc0316788ba1974370021dbff2e0937515451cf351873acc31
BLAKE2b-256 checksum
How to use checksums
40c66d69993cbe6e3cf0ff193e01d42cd6b8d0f2682574eaf1e4e2da73b2121d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.2

Release history Release notifications | RSS feed

This release

1.3.0 This release

2 release files

1.2.6

2 release files

1.2.5

2 release files

1.2.4

2 release files

1.2.3

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.5

2 release files

1.1.4

2 release files

1.1.3

2 release files

1.1.1

2 release files

1.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page