* Docs: Hy <-> Python interop fix #1061 I separated the existing text in two sections, with some additional explanations and a link to Hy's `import`. * added interop page * simplified interop section in tutorial * remove the TODO from interop section in tutorial Because yay * Corrections from @Kodiologist I kept the part about mangling, but added a warning about its incompleteness. I think it can be useful for somebody who just wants to use a Python module in his code. Maybe it can be removed when the actual documentation for mangling is written. * Added myself to AUTHORS. I'll do my best to be worthy of it. Thanks for this awesome project!
This commit is contained in:
parent
99d31d153c
commit
83cdaf0a71
1
AUTHORS
1
AUTHORS
@ -74,3 +74,4 @@
|
|||||||
* Karan Sharma <karansharma1295@gmail.com>
|
* Karan Sharma <karansharma1295@gmail.com>
|
||||||
* Sergey Sobko <s.sobko@profitware.ru>
|
* Sergey Sobko <s.sobko@profitware.ru>
|
||||||
* Philip Xu <pyx@xrefactor.com>
|
* Philip Xu <pyx@xrefactor.com>
|
||||||
|
* Charles de Lacombe <ealhad@mail.com>
|
||||||
|
@ -1049,6 +1049,7 @@ reverses the comparison.
|
|||||||
=> (lif-not False "true" "false")
|
=> (lif-not False "true" "false")
|
||||||
"false"
|
"false"
|
||||||
|
|
||||||
|
.. _import:
|
||||||
|
|
||||||
import
|
import
|
||||||
------
|
------
|
||||||
|
@ -8,6 +8,7 @@ Contents:
|
|||||||
:maxdepth: 3
|
:maxdepth: 3
|
||||||
|
|
||||||
cli
|
cli
|
||||||
|
interop
|
||||||
api
|
api
|
||||||
core
|
core
|
||||||
readermacros
|
readermacros
|
||||||
|
135
docs/language/interop.rst
Normal file
135
docs/language/interop.rst
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
=====================
|
||||||
|
Hy <-> Python interop
|
||||||
|
=====================
|
||||||
|
|
||||||
|
“Keep in mind we’re not Clojure. We’re not Common Lisp. We’re Homoiconic
|
||||||
|
Python, with extra bits that make sense.” — Hy Style Guide
|
||||||
|
|
||||||
|
Despite being a Lisp, Hy aims to be fully compatible with Python. That means
|
||||||
|
every Python module or package can be imported in Hy code, and vice versa.
|
||||||
|
|
||||||
|
Using Python from Hy
|
||||||
|
====================
|
||||||
|
|
||||||
|
Using Python from Hy is nice and easy, you just have to :ref:`import` it.
|
||||||
|
|
||||||
|
If you have the following in ``greetings.py`` in Python::
|
||||||
|
|
||||||
|
def greet(name):
|
||||||
|
print("hello," name)
|
||||||
|
|
||||||
|
You can use it in Hy:
|
||||||
|
|
||||||
|
.. code-block:: clj
|
||||||
|
|
||||||
|
(import greetings)
|
||||||
|
(.greet greetings "foo") ; prints "hello, foo"
|
||||||
|
|
||||||
|
You can also import ``.pyc`` bytecode files, of course.
|
||||||
|
|
||||||
|
A quick note about mangling
|
||||||
|
--------
|
||||||
|
|
||||||
|
In Python, snake_case is used by convention. Lisp dialects tend to use dashes
|
||||||
|
instead of underscores, so Hy does some magic to give you more pleasant names.
|
||||||
|
|
||||||
|
In the same way, ``UPPERCASE_NAMES`` from Python can be used ``*with-earmuffs*``
|
||||||
|
instead.
|
||||||
|
|
||||||
|
You can use either the original names or the new ones.
|
||||||
|
|
||||||
|
Imagine ``example.py``::
|
||||||
|
|
||||||
|
def function_with_a_long_name():
|
||||||
|
print(42)
|
||||||
|
|
||||||
|
FOO = "bar"
|
||||||
|
|
||||||
|
Then, in Hy:
|
||||||
|
|
||||||
|
.. code-block:: clj
|
||||||
|
|
||||||
|
(import example)
|
||||||
|
(.function-with-a-long-name example) ; prints "42"
|
||||||
|
(.function_with_a_long_name example) ; also prints "42"
|
||||||
|
|
||||||
|
(print (. example *foo*)) ; prints "bar"
|
||||||
|
(print (. example FOO)) ; also prints "bar"
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
Mangling isn’t that simple; there is more to discuss about it, yet it doesn’t
|
||||||
|
belong in this section.
|
||||||
|
.. TODO: link to mangling section, when it is done
|
||||||
|
|
||||||
|
|
||||||
|
Using Hy from Python
|
||||||
|
====================
|
||||||
|
|
||||||
|
Suppose you have written some useful utilities in Hy, and you want to use them in
|
||||||
|
regular Python, or to share them with others as a package. Or suppose you work
|
||||||
|
with somebody else, who doesn't like Hy (!), and only uses Python.
|
||||||
|
|
||||||
|
In any case, you need to know how to use Hy from Python. Fear not, for it is
|
||||||
|
easy.
|
||||||
|
|
||||||
|
If you save the following in ``greetings.hy``:
|
||||||
|
|
||||||
|
.. code-block:: clj
|
||||||
|
|
||||||
|
(setv *this-will-be-in-caps-and-underscores* "See?")
|
||||||
|
(defn greet [name] (Print "hello from hy," name))
|
||||||
|
|
||||||
|
Then you can use it directly from Python, by importing Hy before importing
|
||||||
|
the module. In Python::
|
||||||
|
|
||||||
|
import hy
|
||||||
|
import greetings
|
||||||
|
|
||||||
|
greetings.greet("Foo") # prints "Hello from hy, Foo"
|
||||||
|
print(THIS_WILL_BE_IN_CAPS_AND_UNDERSCORES) # prints "See?"
|
||||||
|
|
||||||
|
If you create a package with Hy code, and you do the ``import hy`` in
|
||||||
|
``__init__.py``, you can then directly include the package. Of course, Hy still
|
||||||
|
has to be installed.
|
||||||
|
|
||||||
|
Compiled files
|
||||||
|
--------------
|
||||||
|
|
||||||
|
You can also compile a module with ``hyc``, which gives you a ``.pyc`` file. You
|
||||||
|
can import that file. Hy does not *really* need to be installed ; however, if in
|
||||||
|
your code, you use any symbol from :doc:`core`, a corresponding ``import``
|
||||||
|
statement will be generated, and Hy will have to be installed.
|
||||||
|
|
||||||
|
Even if you do not use a Hy builtin, but just another function or variable with
|
||||||
|
the name of a Hy builtin, the ``import`` will be generated. For example, the previous code
|
||||||
|
causes the import of ``name`` from ``hy.core.language``.
|
||||||
|
|
||||||
|
**Bottom line: in most cases, Hy has to be installed.**
|
||||||
|
|
||||||
|
Launching a Hy REPL from Python
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
You can use the function ``run_repl()`` to launch the Hy REPL from Python::
|
||||||
|
|
||||||
|
>>> import hy.cmdline
|
||||||
|
>>> hy.cmdline.run_repl()
|
||||||
|
hy 0.12.1 using CPython(default) 3.6.0 on Linux
|
||||||
|
=> (defn foo [] (print "bar"))
|
||||||
|
=> (test)
|
||||||
|
bar
|
||||||
|
|
||||||
|
If you want to print the Python code Hy generates for you, use the ``spy``
|
||||||
|
argument::
|
||||||
|
|
||||||
|
>>> import hy.cmdline
|
||||||
|
>>> hy.cmdline.run_repl(spy=True)
|
||||||
|
hy 0.12.1 using CPython(default) 3.6.0 on Linux
|
||||||
|
=> (defn test [] (print "bar"))
|
||||||
|
def test():
|
||||||
|
return print('bar')
|
||||||
|
=> (test)
|
||||||
|
test()
|
||||||
|
bar
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -8,7 +8,6 @@ Tutorial
|
|||||||
.. - How do I do array ranges? e.g. x[5:] or y[2:10]
|
.. - How do I do array ranges? e.g. x[5:] or y[2:10]
|
||||||
.. - Blow your mind with macros!
|
.. - Blow your mind with macros!
|
||||||
.. - Where's my banana???
|
.. - Where's my banana???
|
||||||
.. - Mention that you can import .hy files in .py files and vice versa!
|
|
||||||
|
|
||||||
Welcome to the Hy tutorial!
|
Welcome to the Hy tutorial!
|
||||||
|
|
||||||
@ -585,7 +584,10 @@ compile-time. ``require`` uses the same syntax as ``import``.
|
|||||||
Hy <-> Python interop
|
Hy <-> Python interop
|
||||||
=====================
|
=====================
|
||||||
|
|
||||||
By importing Hy, you can use Hy directly from Python!
|
Using Hy from Python
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
You can use Hy modules in Python!
|
||||||
|
|
||||||
If you save the following in ``greetings.hy``:
|
If you save the following in ``greetings.hy``:
|
||||||
|
|
||||||
@ -593,7 +595,7 @@ If you save the following in ``greetings.hy``:
|
|||||||
|
|
||||||
(defn greet [name] (print "hello from hy," name))
|
(defn greet [name] (print "hello from hy," name))
|
||||||
|
|
||||||
Then you can use it directly from python, by importing hy before importing
|
Then you can use it directly from Python, by importing Hy before importing
|
||||||
the module. In Python::
|
the module. In Python::
|
||||||
|
|
||||||
import hy
|
import hy
|
||||||
@ -601,40 +603,24 @@ the module. In Python::
|
|||||||
|
|
||||||
greetings.greet("Foo")
|
greetings.greet("Foo")
|
||||||
|
|
||||||
You can also declare a function in python (or even a class!) and use it in Hy!
|
Using Python from Hy
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
You can also use any Python module in Hy!
|
||||||
|
|
||||||
If you save the following in ``greetings.py`` in Python::
|
If you save the following in ``greetings.py`` in Python::
|
||||||
|
|
||||||
def greet(name):
|
def greet(name):
|
||||||
print("hello, %s" % (name))
|
print("hello, %s" % (name))
|
||||||
|
|
||||||
You can use it in Hy:
|
You can use it in Hy (see :ref:`import`):
|
||||||
|
|
||||||
.. code-block:: clj
|
.. code-block:: clj
|
||||||
|
|
||||||
(import greetings)
|
(import greetings)
|
||||||
(.greet greetings "foo")
|
(.greet greetings "foo")
|
||||||
|
|
||||||
To use keyword arguments, you can use in ``greetings.py``::
|
More information on :doc:`../language/interop`.
|
||||||
|
|
||||||
def greet(name, title="Sir"):
|
|
||||||
print("Greetings, %s %s" % (title,name))
|
|
||||||
|
|
||||||
.. code-block:: clj
|
|
||||||
|
|
||||||
(import greetings)
|
|
||||||
(.greet greetings "Foo")
|
|
||||||
(.greet greetings "Foo" "Darth")
|
|
||||||
(apply (. greetings greet) ["Foo"] {:title "Lord"})
|
|
||||||
|
|
||||||
Which would output::
|
|
||||||
|
|
||||||
Greetings, Sir Foo
|
|
||||||
|
|
||||||
Greetings, Darth Foo
|
|
||||||
|
|
||||||
Greetings, Lord Foo
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Protips!
|
Protips!
|
||||||
|
Loading…
x
Reference in New Issue
Block a user