Mit ErlPort können Sie mit Python- und Ruby-Code von Elixir arbeiten.
Es gab jedoch keine Beschreibung der Klasse in Dokumentation, daher habe ich es tatsächlich versucht.
Aus der Schlussfolgerung ist es ein wenig eingängig.
$ mix new python
python/mix.exs
defmodule Python.Mixfile do
# ...
defp deps do
[
{:erlport, github: "hdima/erlport"}
]
end
end
python/sample.py
class Sample(object):
def __init__(self):
print("Sample.__init__")
self.message = "Hello, world!"
def print_message(self):
print(self.message)
def set_message(self, msg):
self.message = msg
Starten Sie den Python-Prozess mit : python.start ()
und rufen Sie die Funktion mit : python.call ()
auf.
$ iex -S mix
iex(7)> {:ok, python} = :python.start([python_path: '.'])
iex(8)> obj = python |> :python.call(:sample, :Sample, [])
Sample.__init__
iex(9)> python |> :python.call(:sample, :"Sample.print_message", [obj])
Hello, world!
Bisher gibt es kein Problem. Versuchen Sie als nächstes, "Sample.set_message ()" aufzurufen.
iex(13)> python |> :python.call(:sample, :"Sample.set_message", [obj, "Hello, ErlPort!"])
iex(14)> python |> :python.call(:sample, :"Sample.print_message", [obj])
Hello, world!
Das? Die Nachricht hat sich nicht geändert.
Wenn Sie versuchen, "self" mit "Sample.set_message ()" zurückzugeben und den Anrufer empfangen zu lassen,
python/sample.py
class Sample(object):
# ...
def set_message(self, msg):
self.message = msg
return self
iex(15)> {:ok, python} = :python.start([python_path: '.'])
iex(16)> obj = python |> :python.call(:sample, :Sample, [])
Sample.__init__
iex(18)> obj = python |> :python.call(:sample, :"Sample.set_message", [obj, "Hello, ErlPort!"])
iex(19)> python |> :python.call(:sample, :"Sample.print_message", [obj])
Hello, ErlPort!
:undefined
Diesmal hat sich die Nachricht geändert. Es verhält sich so, als wäre "Selbst" ein unveränderliches Objekt.
Recommended Posts