pykx.q Library Reference Card
Tip: For the best experience, read How to use PyKX within q and Why upgrade from embedPy first.
This page documents the functions found in the pykx.q
q library that are available.
This library can be installed by calling a helper function within PyKX
, this function will move
all the required files and libraries into your QHOME
directory.
import pykx as kx
kx.install_into_QHOME()
or equivalently using only command line
python -c "import pykx;pykx.install_into_QHOME()"
If you previously had embedPy
installed pass:
python -c "import pykx;pykx.install_into_QHOME(overwrite_embedpy=True)"
If you cannot edit files in QHOME
you can copy the files to your local folder and load pykx.q
from there:
python -c "import pykx;pykx.install_into_QHOME(to_local_folder=True)"
Gain access to the .pykx
namespace within the q
session
q)\l pykx.q
PyKX q API functionality:
.pykx.
General: console open an interactive Python REPL version retrieve PyKX version print print a Python object directly to stdout repr evaluate the Python function repr() on supplied Python object debugInfo print useful process debug information to q session loadPy load a .py/.p script executed according to Python script execution logic
Data Conversions:
setdefault define the default conversion for KX objects to Python
toq convert an (un)wrapped PyKX
foreign object into a q type
toq0 convert an (un)wrapped PyKX
foreign object into a q type, use 2nd parameter to allow str objects to return as strings
tok tag a q object to be indicate conversion to a Pythonic PyKX object when called in Python
topy tag a q object to be indicate conversion to a Python object when called in Python
tonp tag a q object to be indicate conversion to a Numpy object when called in Python
topd tag a q object to be indicate conversion to a Pandas object when called in Python
topa tag a q object to be indicate conversion to a PyArrow object when called in Python
toraw tag a q object to be indicate conversion to a raw representation object when called in Python
Evaluation and Execution: eval evaluate a string as Python code returning a wrapped foreign object pyeval evaluate a string as Python code returning a foreign object qeval evaluate a string as Python code returning a q object pyexec execute a string as Python code in Python memory
Python Library Integration: import import a Python library and store as a wrapped foreign object pyimport import a Python library and store as a foreign object
Callable Object Generation: qcallable convert a Python foreign object to a callable function which returns a q result pycallable convert a Python foreign object to a callable function which returns a Python result
Object Setting and Retrieval: set set a q object as a named object in Python memory setattr set an attribute of a Python object get retrieve a named item from the Python memory getattr retrieve an attribute of a Python object
Foreign and PyKX object Handling: wrap convert a foreign object generated from Python execution to a callable q object unwrap convert a wrapped foreign object generated from this interface into a python foreign
.q.
Python Function Argument Utilities:
pykw allow users to apply individual keywords to a Python function
pyarglist allow users to apply a list of arguments to a Python function, equivalent to *args
pykwargs allow users to apply a dictionary of named arguments to a Python function, equivalent to *kwargs
.pykx.console
Open an interactive python REPL from within a q session similar to launching python from the command line.
.pykx.console[]
Returns:
type | description |
---|---|
:: |
This function has no explicit return but execution of the function will initialise a Python REPL. |
Example:
Enter PyKX console and evaluate Python code
q).pykx.console[]
>>> 1+1
2
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> quit()
q)
// Enter PyKX console setting q objects using PyKX
q).pykx.console[]
>>> import pykx as kx
>>> kx.q['table'] = kx.q('([]2?1f;2?0Ng;2?`3)'
>>> quit()
q)table
x x1 x2
--------------------------------------------------
0.439081 49f2404d-5aec-f7c8-abba-e2885a580fb6 mil
0.5759051 656b5e69-d445-417e-bfe7-1994ddb87915 igf
// Enter PyKX console setting Python objects using PyKX
q).pykx.console[]
>>> a = list(range(5))
>>> quit()
q).pykx.eval["a"]`
0 1 2 3 4
.pykx.debugInfo
Library and environment information which can be used for environment debugging
.pykx.debugInfo[]
Returns:
type | description |
---|---|
list |
A list of strings containing information useful for debugging |
Example:
q).pykx.debugInfo[]
"**** PyKX information ****"
"pykx.args: ()"
"pykx.qhome: /usr/local/anaconda3/envs/qenv/q"
"pykx.qlic: /usr/local/anaconda3/envs/qenv/q"
"pykc.licensed: True"
..
.pykx.eval
Evaluates a string
as python code and return the result as a wrapped foreign
type.
.pykx.eval[pythonCode]
Parameters:
name | type | description |
---|---|---|
pythonCode |
string | A string of Python code to be executed returning the result as a wrapped foreign object. |
Return:
type | description |
---|---|
composition |
A wrapped foreign object which can be converted to q or Python objects |
// Evaluate the code and return as a wrapped foreign object
q).pykx.eval"1+1"
{[f;x].pykx.util.pykx[f;x]}[foreign]enlist
// Evaluate the code and convert to Python foreign
q).pykx.eval["1+1"]`.
foreign
// Evaluate the code and convert to a q object
q).pykx.eval["lambda x: x + 1"][5]`
6
.pykx.get
Retrieve a named item from the Python memory
.pykx.get[objectName]
Parameters:
name | type | description |
---|---|---|
objectName |
symbol | A named entity to retrieve from Python memory as a wrapped q foreign object. |
Return:
type | description |
---|---|
composition |
A wrapped foreign object which can be converted to q or Python objects |
// Set an item in Python memory and retrieve using .pykx.get
q).pykx.set[`test;til 10]
q).pykx.get[`test]
{[f;x].pykx.util.pykx[f;x]}[foreign]enlist
// Convert to q and Python objects
q).pykx.get[`test]`
0 1 2 3 4 5 6 7 8 9
// Retrieve an item defined entirely using Python
q).pykx.pyexec"import numpy as np"
q).pykx.pyexec"a = np.array([1, 2, 3])"
q).pykx.get[`a]`
1 2 3
.pykx.import
Import a Python library and store as a wrapped foreign object to allow use in q projections/evaluation.
.pykx.import[libName]
Parameters:
name | type | description |
---|---|---|
libName |
symbol | The name of the Python library/module to imported for use |
Return:
type | description |
---|---|
composition |
Returns a wrapped foreign object associated with an imported library on success, otherwise will error if library/module cannot be imported. |
// Import numpy for use as a q object named numpy
q)np:.pykx.import`numpy
q).pykx.print np
<module 'numpy' from '/usr/local/lib64/python3.9/site-packages/numpy/__init__.py'>
// Use a function from within the numpy library using attribute retrieval
q).pykx.print np[`:arange]
<built-in function arange>
q)np[`:arange][10]`
0 1 2 3 4 5 6 7 8 9
.pykx.listExtensions
List all q scripts in the extensions directory which can be loaded
.pykx.listExtensions[]
Returns:
type | description |
---|---|
list |
A list of strings denoting the available extensions in your version of PyKX |
Example:
q)\l pykx.q
q).pykx.listExtensions[]
"dashboards"
.pykx.loadExtension
Loading of a PyKX extension
.pykx.loadExtension[ext]
Parameters:
name | type | description |
---|---|---|
ext |
string |
The name of the extension which is to be loaded |
Returns:
type | description |
---|---|
null |
On successful execution this function will load the extension and return null |
Example:
q)\l pykx.q
q)`dash in key `.pykx
0b
q).pykx.listExtensions[]
"dashboards"
q)`dash in key `.pykx
1b
.pykx.loadPy
Load and execute a .p/.py file manually
.pykx.loadPy["file.py"]
Parameters:
name | type | description |
---|---|---|
fname |
string |
The name of the python file to be executed |
Returns:
type | description |
---|---|
:: |
Returns generic null on successful execution otherwise returns the error message raised |
Example:
q)\cat file.py
"def func(x):"
" return x+1"
q).pykx.loadPy["file.py"]
q).pykx.get[`func][10]`
11
.pykx.print
Print a python object directly to stdout. This is equivalent to calling print()
on the object in Python.
.pykx.print[pythonObject]
print[pythonObject]
Parameters:
name | type | description |
---|---|---|
pythonObject |
(wrapped) foreign | A Python object retrieved from the Python memory space, if passed a q object this will be 'shown' |
Return:
type | description |
---|---|
:: |
Will print the output to stdout but return null |
// Use a wrapped foreign object
q)a: .pykx.eval"1+1"
q).pykx.print a
2
// Use a foreign object
q)a: .pykx.eval"'hello world'"
q).pykx.print a`.
hello world
// Use a q object
q).pykx.print til 5
0 1 2 3 4
// Print the return of a conversion object
q).pykx.print .pykx.topd ([]5?1f;5?0b)
x x1
0 0.178084 False
1 0.301772 True
2 0.785033 True
3 0.534710 False
4 0.711172 False
.pykx.toq
Convert an (un)wrapped PyKX
foreign object into an analogous q type.
.pykx.toq[pythonObject]
Parameters:
name | type | description |
---|---|---|
pythonObject |
foreign/composition | A foreign Python object or composition containing a Python foreign to be converted to q |
Return:
type | description |
---|---|
any |
A q object converted from Python |
// Convert a wrapped PyKX foreign object to q
q)show a:.pykx.eval["1+1"]
{[f;x].pykx.util.pykx[f;x]}[foreign]enlist
q).pykx.toq a
2
// Convert an unwrapped PyKX foreign object to q
q)show b:a`.
foreign
q).pykx.toq b
2
.pykx.pycallable
Convert a Python foreign object to a callable function which returns a Python foreign result
.pykx.pycallable[pyObject]
Parameters:
name | type | description |
---|---|---|
pyObject |
foreign |
A Python object representing an underlying callable function |
Returns:
type | description |
---|---|
foreign |
The return of the Python callable function as a foreign object |
Example:
q)wrappedPy:.pykx.import[`numpy;`:arange]
q)show setCallable:.pykx.pycallable[wrappedPy][1;3]
foreign
q).pykx.print setCallable
[1 2]
.pykx.pyeval
Evaluates a CharVector
as python code and return the result as a q
foreign.
.pykx.pyeval[pythonCode]
Parameters:
name | type | description |
---|---|---|
pythonCode |
string |
A string of Python code to be evaluated returning the result as a q foreign object. |
Return:
type | description |
---|---|
foreign |
The return of the Python string evaluation returned as a q foreign. |
// evaluate a Python string
q).pykx.pyeval"1+1"
foreign
// Use a function defined in Python taking a single argument
q).pykx.pyeval["lambda x: x + 1"][5]
foreign
// Use a function defined in Python taking multiple arguments
q).pykx.pyeval["lambda x, y: x + y"][4;5]
foreign
.pykx.pyexec
Executes a string
as python code in Python memory.
.pykx.pyexec[pythonCode]
Parameters:
name | type | description |
---|---|---|
pythonCode |
string | A string of Python code to be executed. |
Return:
type | description |
---|---|
:: |
Returns generic null on successful execution, will return an error if execution of Python code is unsuccessful. |
// Execute valid Python code
q).pykx.pyexec"1+1"
q).pykx.pyexec"a = 1+1"
// Evaluate the Python code returning the result to q
q).pykx.qeval"a"
2
// Attempt to execute invalid Python code
q).pykx.pyexec"1+'test'"
'TypeError("unsupported operand type(s) for +: 'int' and 'str'")
[0] .pykx.pyexec["1+'test'"]
^
.pykx.qcallable
Convert a Python foreign object to a callable function which returns a q result
.pykx.qcallable[pyObject]
Parameters:
name | type | description |
---|---|---|
pyObject |
foreign |
A Python object representing an underlying callable function |
Returns:
type | description |
---|---|
any |
The return of the Python callable function as an appropriate q object |
Example:
q)wrappedPy:.pykx.import[`numpy;`:arange]
q)show setCallable:.pykx.pycallable[wrappedPy][1;3]
foreign
q).pykx.print setCallable
[1 2]
.pykx.qeval
Evaluates a CharVector
in Python returning the result as a q object.
.pykx.qeval[pythonCode]
Parameters:
name | type | description |
---|---|---|
pythonCode |
string | A string of Python code to be evaluated returning the result as a q object. |
Return:
type | description |
---|---|
any |
The return of the Python string evaluation returned as a q object. |
// evaluate a Python string
q).pykx.qeval"1+1"
2
// Use a function defined in Python taking a single argument
q).pykx.qeval["lambda x: x + 1"][5]
6
// Use a function defined in Python taking multiple arguments
q).pykx.qeval["lambda x, y: x + y"][4;5]
9
.pykx.repr
Evaluate the python function repr()
on an object retrieved from Python memory
.pykx.repr[pythonObject]
Parameters:
name | type | description |
---|---|---|
pythonObject |
any |
A Python object retrieved from the Python memory space, if passed a q object this will retrieved using .Q.s1 . |
Return:
type | description |
---|---|
string |
The string representation of the Python/q object |
// Use a wrapped foreign object
q)a: .pykx.eval"1+1"
q).pykx.repr a
,"2"
// Use a foreign object
q)a: .pykx.eval"'hello world'"
q).pykx.repr a`.
"hello world"
// Use a q object
q).pykx.repr til 5
"0 1 2 3 4"
.pykx.safeReimport
Isolated execution of a q function which relies on importing PyKX
.pykx.safeReimport[qFunction]
For more information on the reimporter module which this functionality calls see https://code.kx.com/pykx/api/reimporting.html#pykx.reimporter.PyKXReimport
Parameters:
name | type | description |
---|---|---|
qFunction |
function |
A function which is to be run following unsetting of PyKX environment variables and prior to their reset |
Returns:
type | description |
---|---|
any |
On successful execution this function will return the result of the executed function |
Example:
Initializing a Python process which imports PyKX
q)\l pykx.q
q).pykx.safeReimport[{system"python -c 'import pykx as kx'";til 5}]
0 1 2 3 4
Initializing a q child process which uses pykx.q
q)\cat child.q
"\l pykx.q"
".pykx.print \"Hello World\""
q)\l pykx.q
q)system"q child.q" // Failing execution
q)'2024.08.29T12:29:39.967 util.whichPython
[5] /usr/local/anaconda3/envs/qenv/q/pykx.q:123:
(`os ; util.os);
(`whichPython ; util.whichPython)
^
)
[2] /usr/projects/pykx/child.q:1: \l pykx.q
^
q).pykx.safeReimport {system"q child.q"}
"Hello World"
Parameter:
Name | Type | Description |
---|---|---|
x |
.pykx.set
Set a q object to a named and type specified object in Python memory
.pykx.set[objectName;qObject]
Parameters:
name | type | description |
---|---|---|
objectName |
symbol |
The name to be associated with the q object being persisted to Python memory |
qObject |
any |
The q/Python entity that is to be stored to Python memory |
Return:
type | description |
---|---|
:: |
Returns null on successful execution |
// Set a q array of guids using default behavior
q).pykx.set[`test;3?0Ng]
q)print .pykx.get`test
[UUID('3d13cc9e-f7f1-c0ee-782c-5346f5f7b90e')
UUID('c6868d41-fa85-233b-245f-55160cb8391a')
UUID('e1e5fadd-dc8e-54ba-e30b-ab292df03fb0')]
// Set a q table as pandas dataframe
q).pykx.set[`test;.pykx.topd ([]5?1f;5?1f)]
q)print .pykx.get`test
x x1
0 0.301772 0.392752
1 0.785033 0.517091
2 0.534710 0.515980
3 0.711172 0.406664
4 0.411597 0.178084
// Set a q table as pyarrow table
q).pykx.set[`test;.pykx.topa ([]2?0p;2?`a`b`c;2?1f;2?0t)]
q)print .pykx.get`test
pyarrow.Table
x: timestamp[ns]
x1: string
x2: double
x3: duration[ns]
----
x: [[2002-06-11 11:57:24.452442976,2001-12-28 01:34:14.199305176]]
x1: [["c","a"]]
x2: [[0.7043314231559634,0.9441670505329967]]
x3: [[2068887000000,41876091000000]]
.pykx.setattr
Set an attribute of a Python object, this is equivalent to calling Python's setattr(f, a, x) function
.pykx.setattr[pythonObject;attrName;attrObj]
Parameters:
name | type | description |
---|---|---|
pythonObject |
foreign/composition |
The Python object on which the defined attribute is to be set |
attrName |
symbol |
The name to be associated with the set attribute |
attrObject |
any |
The object which is to be set as an attribute associated with pythonObject |
Returns:
type | description |
---|---|
:: |
Returns generic null on successful execution otherwise returns the error message raised |
Example:
// Define a Python object to which attributes can be set
q).pykx.pyexec"aclass = type('TestClass', (object,), {'x': pykx.LongAtom(3), 'y': pykx.toq('hello')})";
q)a:.pykx.get`aclass
// Retrieve an existing attribute to show defined behavior
q)a[`:x]`
3
// Retrieve a named attribute that doesn't exist
q)a[`:r]`
// Set an attribute 'r' and retrieve the return
q).pykx.setattr[a; `r; til 4]
q)a[`:r]`
0 1 2 3
q).pykx.print a[`:r]
[0 1 2 3]
// Set an attribute 'k' to be a Pandas type
q).pykx.setattr[a;`k;.pykx.topd ([]2?1f;2?0Ng;2?`2)]
q)a[`:k]`
x x1 x2
-------------------------------------------------
0.4931835 0a3e1784-0125-1b68-5ae7-962d49f2404d mi
0.5785203 5aecf7c8-abba-e288-5a58-0fb6656b5e69 ig
q).pykx.print a[`:k]
x x1 x2
0 0.493183 0a3e1784-0125-1b68-5ae7-962d49f2404d mi
1 0.578520 5aecf7c8-abba-e288-5a58-0fb6656b5e69 ig
// Attempt to set an attribute against an object which does not support this behavior
q)arr:.pykx.eval"[1, 2, 3]"
q).pykx.setattr[arr;`test;5]
'AttributeError("'list' object has no attribute 'test'")
[1] /opt/kx/pykx.q:218: .pykx.util.setattr:
cx:count x;
util.setAttr[unwrap x 0;x 1;;x 2]
^
$[cx>4;
.pykx.setdefault
Define the default conversion type for KX objects when converting from q to Python
.pykx.setdefault[conversionFormat]
Parameters:
name | type | description |
---|---|---|
conversionFormat |
string | The Python data format to which all q objects when passed to Python will be converted. |
Returns:
type | description |
---|---|
:: |
Returns generic null on successful execution and updates variable .pykx.util.defaultConv |
Supported Options
The following outlines the supported conversion types and the associated values which can be passed to set these values
Conversion Format | Accepted inputs |
---|---|
Numpy | "np", "numpy", "Numpy" |
Pandas | "pd", "pandas", "Pandas" |
Python | "py", "python", "Python" |
PyArrow | "pa", "pyarrow", "PyArrow" |
K | "k", "q" |
raw | "raw" |
default | "default" |
// Default value on startup is "default"
q).pykx.util.defaultConv
"default"
// Set default value to Pandas
q).pykx.setdefault["Pandas"]
q).pykx.util.defaultConv
"pd"
.pykx.todefault
Tag a q object to indicate it should use the PyKX default conversion when called in Python
.pykx.todefault[qObject]
Parameters:
name | type | description |
---|---|---|
qObject |
any |
A q object which is to be converted to a default form in Python. |
Return:
type | description |
---|---|
projection |
A projection which is used to indicate that once the q object is passed to Python for evaluation is should be treated as a default object. |
Note
The todefault
conversion is used to match embedPy conversion logic, in particular it converts q lists to Python lists when dealing with contiguous datatypes rather than to nested single value array types. Additionally it converts q tables to Pandas DataFrames
// Denote that a q object once passed to Python should be managed as a default object
// in this case a q list is converted to numpy
q).pykx.todefault til 10
enlist[`..numpy;;][0 1 2 3 4 5 6 7 8 9]
// Pass a q list to Python treating the Python object as PyKX default
q).pykx.print .pykx.eval["lambda x: type(x)"] .pykx.todefault (til 10;til 10)
<class 'list'>
// Pass a q Table to Python by default treating the Python table as a Pandas DataFrame
q).pykx.print .pykx.eval["lambda x: type(x)"] .pykx.todefault ([]til 10;til 10)
<class 'pandas.core.frame.DataFrame'>
.pykx.tok
Tag a q object to be indicate conversion to a Pythonic PyKX object when called in Python
.pykx.tok[qObject]
Parameters:
name | type | description |
---|---|---|
qObject |
any |
A q object which is to be defined as a PyKX object in Python. |
Return:
type | description |
---|---|
projection |
A projection which is used to indicate that once the q object is passed to Python for evaluation is should be treated as a PyKX type object. |
// Denote that a q object once passed to Python should be managed as a PyKX object
q).pykx.tok til 10
enlist[`..k;;][0 1 2 3 4 5 6 7 8 9]
// Pass a q object to Python with default conversions and return type
q).pykx.print .pykx.eval["lambda x: type(x)"]til 10
<class 'numpy.ndarray'>
// Pass a q object to Python treating the Python object as a PyKX object
q).pykx.print .pykx.eval["lambda x: type(x)"] .pykx.tok til 10
<class 'pykx.wrappers.LongVector'>
.pykx.tonp
Tag a q object to be indicate conversion to a Numpy object when called in Python
.pykx.tonp[qObject]
Parameters:
name | type | description |
---|---|---|
qObject |
any |
A q object which is to be defined as a Numpy object in Python. |
Return:
type | description |
---|---|
projection |
A projection which is used to indicate that once the q object is passed to Python for evaluation is should be treated as a Numpy type object. |
// Denote that a q object once passed to Python should be managed as a Numpy object
q).pykx.tonp til 10
enlist[`..numpy;;][0 1 2 3 4 5 6 7 8 9]
// Update the default conversion type to be non numpy
q).pykx.util.defaultConv:"py"
// Pass a q object to Python with default conversions and return type
q).pykx.print .pykx.eval["lambda x: type(x)"]til 10
<class 'list'>
// Pass a q object to Python treating the Python object as a Numpy Object
q).pykx.print .pykx.eval["lambda x: type(x)"] .pykx.tonp til 10
<class 'numpy.ndarray'>
.pykx.topa
Tag a q object to be indicate conversion to a PyArrow object when called in Python
.pykx.topa[qObject]
Parameters:
name | type | description |
---|---|---|
qObject |
any |
A q object which is to be defined as a PyArrrow object in Python. |
Return:
type | description |
---|---|
projection |
A projection which is used to indicate that once the q object is passed to Python for evaluation is should be treated as a PyArrow type object. |
// Denote that a q object once passed to Python should be managed as a PyArrow object
q).pykx.topa til 10
enlist[`..pyarrow;;][0 1 2 3 4 5 6 7 8 9]
// Pass a q object to Python with default conversions and return type
q).pykx.print .pykx.eval["lambda x: type(x)"]til 10
<class 'numpy.ndarray'>
// Pass a q object to Python treating the Python object as a PyArrow Object
q).pykx.print .pykx.eval["lambda x: type(x)"] .pykx.topa til 10
<class 'pyarrow.lib.Int64Array'>
.pykx.topd
Tag a q object to be indicate conversion to a Pandas object when called in Python
.pykx.topd[qObject]
Parameters:
name | type | description |
---|---|---|
qObject |
any |
A q object which is to be defined as a Pandas object in Python. |
Return:
type | description |
---|---|
projection |
A projection which is used to indicate that once the q object is passed to Python for evaluation is should be treated as a Pandas type object. |
// Denote that a q object once passed to Python should be managed as a Pandas object
q).pykx.topd til 10
enlist[`..pandas;;][0 1 2 3 4 5 6 7 8 9]
// Pass a q object to Python with default conversions and return type
q).pykx.print .pykx.eval["lambda x: type(x)"]til 10
<class 'numpy.ndarray'>
// Pass a q object to Python treating the Python object as a Pandas Object
q).pykx.print .pykx.eval["lambda x: type(x)"] .pykx.topd til 10
<class 'pandas.core.series.Series'>
.pykx.topy
Tag a q object to be indicate conversion to a Python object when called in Python
.pykx.topy[qObject]
Parameters:
name | type | description |
---|---|---|
qObject |
any |
A q object which is to be defined as a Python object in Python. |
Return:
type | description |
---|---|
projection |
A projection which is used to indicate that once the q object is passed to Python for evaluation is should be treated as a Python type object. |
// Denote that a q object once passed to Python should be managed as a Python object
q).pykx.topy til 10
enlist[`..python;;][0 1 2 3 4 5 6 7 8 9]
// Pass a q object to Python with default conversions and return type
q).pykx.print .pykx.eval["lambda x: type(x)"]til 10
<class 'numpy.ndarray'>
// Pass a q object to Python treating the Python object as a Python Object
q).pykx.print .pykx.eval["lambda x: type(x)"] .pykx.topy til 10
<class 'list'>
.pykx.toq0
Convert an (un)wrapped PyKX
foreign object into an analogous q type.
.pykx.toq0[pythonObject;strAsChar]
Parameters:
name | type | description |
---|---|---|
pythonObject |
foreign/composition | A foreign Python object or composition containing a Python foreign to be converted to q |
strAsChar |
Optional[boolean] | A boolean indicating if when returned to q a Python str should be converted to a q string rather than the default symbol |
Return:
type | description |
---|---|
any |
A q object converted from Python |
// Convert a wrapped PyKX foreign object to q
q)show a:.pykx.eval["1+1"]
{[f;x].pykx.util.pykx[f;x]}[foreign]enlist
q).pykx.toq0 a
2
// Convert an unwrapped PyKX foreign object to q
q)show b:a`.
foreign
q).pykx.toq0 b
2
// Convert a Python string to q symbol or string
q).pykx.toq0[.pykx.eval"\"test\""] `test
q).pykx.toq0[.pykx.eval"\"test\"";1b] "test"
.pykx.toraw
Tag a q object to be indicate a raw conversion when called in Python
.pykx.toraw[qObject]
Parameters:
name | type | description |
---|---|---|
qObject |
any |
A q object which is to be converted in its raw form in Python. |
Return:
type | description |
---|---|
projection |
A projection which is used to indicate that once the q object is passed to Python for evaluation is should be treated as a raw object. |
// Denote that a q object once passed to Python should be managed as a Numpy object
q).pykx.toraw til 10
enlist[`..raw;;][0 1 2 3 4 5 6 7 8 9]
// Pass a q object to Python with default conversions and return type
q).pykx.print .pykx.eval["lambda x: type(x)"]til 10
<class 'numpy.ndarray'>
// Pass a q object to Python treating the Python object as a raw Object
q).pykx.print .pykx.eval["lambda x: type(x)"] .pykx.toraw til 10
<class 'list'>
.pykx.unwrap
Convert a wrapped foreign object generated from this interface into a python foreign.
.pykx.unwrap[wrapObj]
Parameters:
name | type | description |
---|---|---|
wrapObj |
composition/foreign | A (un)wrapped Python foreign object. |
Returns:
type | description |
---|---|
foreign |
The unwrapped representation of the Python foreign object. |
// Generate an object which returns a wrapped Python foreign
q).pykx.set[`test;.pykx.topd ([]2?0p;2?`a`b`c;2?1f;2?0t)]
q)a:.pykx.get`test
q)show a
{[f;x].pykx.util.pykx[f;x]}[foreign]enlist
// Unwrap the wrapped object
q).pykx.unwrap a
foreign
.pykx.version
Retrieve the version of PyKX presently being used by a q process
.pykx.version[]
Return:
type | description |
---|---|
string |
The version number of PyKX installed within the users q session |
q).pykx.version[]
"2.0.0"
.pykx.wrap
Convert a foreign object generated from Python execution to a callable q
object.
.pykx.wrap[pyObject]
Parameters:
name | type | description |
---|---|---|
pyObject |
foreign |
A Python object which is to be converted to a callable q object. |
Returns:
type | description |
---|---|
composition |
The Python object wrapped such that it can be called using q |
// Create a q foreign object in Python
q)a:.pykx.pyeval"pykx.Foreign([1, 2, 3])"
q)a
foreign
q).pykx.print a
[1, 2, 3]
// Wrap the foreign object and convert to q
q)b:.pykx.wrap a
q)b
{[f;x].pykx.util.pykx[f;x]}[foreign]enlist
q)b`
1 2 3
pyarglist
Allow users to apply a list of arguments to a Python function, equivalent to *args
pyarglist argList
Warning
This function will be set in the root .q
namespace
Parameters:
name | type | description |
---|---|---|
argList |
list |
List of optional arguments |
Return:
type | description |
---|---|
projection |
A projection which when used with a wrapped callable Python |
Example:
The following example shows the usage of pyarglist
with a Python function and
various configurations of it's use
q)p)import numpy as np
q)p)def func(a=1,b=2,c=3,d=4):return np.array([a,b,c,d,a*b*c*d])
q)qfunc:.pykx.get[`func;<] / callable, returning q
q)qfunc[pyarglist 1 1 1 1] / full positional list specified
1 1 1 1 1
q)qfunc[pyarglist 1 1] / partial positional list specified
1 1 3 4 12
q)qfunc[1;1;pyarglist 2 2] / mix of positional args and positional list
1 1 2 2 4
q)qfunc[pyarglist 1 1;`d pykw 5] / mix of positional list and keyword args
1 1 3 5 15
pykw
Allow users to apply individual keywords to a Python function
`argName pykw argValue
Warning
This function will be set in the root .q
namespace
Parameters:
name | type | description |
---|---|---|
argName |
symbol |
Name of the keyword argument to be applied |
argValue |
any |
Value to be applied as a keyword |
Return:
type | description |
---|---|
projection |
A projection which when used with a wrapped callable Python |
Example:
The following example shows the usage of pykw
with a Python function
q)p)import numpy as np
q)p)def func(a=1,b=2,c=3,d=4):return np.array([a,b,c,d,a*b*c*d])
q)qfunc:.pykx.get[`func;<] / callable, returning q
q)qfunc[`d pykw 1;`c pykw 2;`b pykw 3;`a pykw 4] / all keyword args specified
4 3 2 1 24
q)qfunc[1;2;`d pykw 3;`c pykw 4] / mix of positional and keyword args
pykwargs
Allow users to apply a dictionary of named arguments to a Python function, equivalent to *kwargs
pykwargs argDict
Warning
This function will be set in the root .q
namespace
Parameters:
name | type | description |
---|---|---|
argDict |
dict |
A dictionary of named keyword arguments mapped to their value |
Return:
type | description |
---|---|
projection |
A projection which when used with a wrapped callable Python |
Example:
The following example shows the usage of pykwargs
with a Python function and
various configurations of it's use
q)p)import numpy as np
q)p)def func(a=1,b=2,c=3,d=4):return np.array([a,b,c,d,a*b*c*d])
q)qfunc:.pykx.get[`func;<] / callable, returning q
q)qfunc[pykwargs`d`c`b`a!1 2 3 4] / full keyword dict specified
4 3 2 1 24
q)qfunc[2;2;pykwargs`d`c!3 3] / mix of positional args and keyword dict
2 2 3 3 36
q)qfunc[`d pykw 1;`c pykw 2;pykwargs`a`b!3 4] / mix of keyword args and keyword dict
3 4 2 1 24
.pykx.pyimport
Import a Python library and store as a foreign object.
.pykx.pyimport[libName]
Parameters:
name | type | description |
---|---|---|
libName |
symbol | The name of the Python library/module to imported for use |
Return:
type | description |
---|---|
foreign |
Returns a foreign object associated with an imported library on success, otherwise will error if library/module cannot be imported. |
// Import numpy for use as a q object named numpy
q)np:.pykx.pyimport`numpy
q).pykx.print np
<module 'numpy' from '/usr/local/lib64/python3.9/site-packages/numpy/__init__.py'>
.pykx.getattr
Retrieve an attribute or property form a foreign Python object returning another foreign.
.pykx.getattr[pythonObject;attrName]
Parameters:
name | type | description |
---|---|---|
pythonObject |
foreign/composition |
The Python object from which the defined attribute is to be retrieved. |
attrName |
symbol |
The name of the attribute to be retrieved. |
Returns:
type | description |
---|---|
foreign |
An unwrapped foreign object containing the retrieved |
Note
Application of this function is equivalent to calling Python's getattr(f, 'x')
function.
The wrapped foreign objects provide a shorthand version of calling .pykx.getattr
. Through the use of the `:x
syntax for attribute/property retrieval
Example:
// Define a class object from which to retrieve Python attributes
q).pykx.pyexec"aclass = type('TestClass', (object,), {'x': pykx.LongAtom(3), 'y': pykx.toq('hello')})";
// Retrieve the class object from Python as a q foreign
q)show a:.pykx.get[`aclass]`.
foreign
// Retrieve an attribute from the Python foreign
q).pykx.getattr[a;`y]
foreign
// Print the Python representation of the foreign object
q)print .pykx.getattr[a;`y]
hello
// Retrieve the attribute from a Python foreign and convert to q
q).pykx.wrap[.pykx.getattr[a;`y]]`
`hello
.pykx.dash.available
Function to denote if all Python libraries required for dashboards are available
.pykx.dash.runFunction
Generate and execute a callable Python function using supplied arguments
.pykx.dash.runFunction[pycode;args]
Parameters:
name | type | description |
---|---|---|
pycode |
string |
The Python code this is to be executed for use as a function |
args |
list |
A mixed/generic list of arguments to be used when calling the function |
Returns:
type | description |
---|---|
list |
The list of argument names associated with the user specified function |
Example:
Single argument function usage:
q).pykx.dash.runFunction["def func(x):\n\treturn x";enlist ([]5?1f;5?1f)]
x x1
-------------------
0.9945242 0.6298664
0.7930745 0.5638081
0.2073435 0.3664924
0.4677034 0.9240405
0.4126605 0.5420167
Multiple argument function usage:
q).pykx.dash.runFunction["def func(x, y):\n\treturn x*y";(2;5)]
10
Function using Python dependencies:
q).pykx.dash.runFunction["import numpy as np\n\ndef func(x):\n\treturn np.linspace(0, x.py(), 5)";enlist 10]
0 2.5 5 7.5 10
Parameters:
Name | Type | Description |
---|---|---|
pyCode | ||
args |
.pykx.dash.util.getFunction
Functionality for the generation of a Python function to be called from code
.pykx.dash.util.getFunction[pycode]
Parameters:
name | type | description |
---|---|---|
pycode |
string |
The Python code this is to be executed for use as a function |
Returns:
type | description |
---|---|
composition |
A wrapped foreign Python object associated with the specified code |
Example:
q).pykx.dash.util.getFunction["def func(x):\n\treturn 1"]
{[f;x].pykx.util.pykx[f;x]}[foreign]enlist
Parameter:
Name | Type | Description |
---|---|---|
pyCode |