internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: hylang/hy

Issue:
New mangling rules interfere with pytest test collection
For example,

```
(defun test-foo->bar [])  ; 'hyx_test_foo_XgreaterHthan_signXbar'
```

The new `hyx_` prefix being the issue of course.


Discussion:

Resolving patch:
diff --git a/hy/compiler.py b/hy/compiler.py
--- a/hy/compiler.py
+++ b/hy/compiler.py
@@ -328,14 +328,6 @@ def is_unpack(kind, x):
             and x[0] == "unpack-" + kind)
 
 
-def ends_with_else(expr):
-    return (expr and
-            isinstance(expr[-1], HyExpression) and
-            expr[-1] and
-            isinstance(expr[-1][0], HySymbol) and
-            expr[-1][0] == HySymbol("else"))
-
-
 class HyASTCompiler(object):
 
     def __init__(self, module_name):
@@ -1350,9 +1342,8 @@ def e(*x): return HyExpression(x)
 
         orel = Result()
         if else_expr is not None:
-            for else_body in else_expr:
-                orel += self.compile(else_body)
-                orel += orel.expr_as_stmt()
+            orel = self._compile_branch(else_expr)
+            orel += orel.expr_as_stmt()
 
         body = self._compile_branch(body)
         body += body.expr_as_stmt()


Test patch:
diff --git a/tests/native_tests/language.hy b/tests/native_tests/language.hy
--- a/tests/native_tests/language.hy
+++ b/tests/native_tests/language.hy
@@ -173,8 +173,7 @@
   "Don't treat strings as symbols in the calling position"
   (with [(pytest.raises TypeError)] ("setv" True 3))  ; A special form
   (with [(pytest.raises TypeError)] ("abs" -2))       ; A function
-  (with [(pytest.raises TypeError)] ("when" 1 2))     ; A macro
-  None)  ; Avoid https://github.com/hylang/hy/issues/1320
+  (with [(pytest.raises TypeError)] ("when" 1 2)))    ; A macro
 
 
 (defn test-for-loop []
diff --git a/tests/native_tests/native_macros.hy b/tests/native_tests/native_macros.hy
--- a/tests/native_tests/native_macros.hy
+++ b/tests/native_tests/native_macros.hy
@@ -194,7 +194,7 @@
   (assert (in (mangle "_;a|") s2))
   (assert (not (= s1 s2))))
 
-(defn test-defmacro-g! []
+(defn test-defmacro/g! []
   (import ast)
   (import [astor.code-gen [to-source]])
   (import [hy.importer [import_buffer_to_ast]])
@@ -213,8 +213,8 @@
   (setv _ast2 (import_buffer_to_ast macro1 "foo"))
   (setv s1 (to_source _ast1))
   (setv s2 (to_source _ast2))
-  (assert (in "_;res|" s1))
-  (assert (in "_;res|" s2))
+  (assert (in (mangle "_;res|") s1))
+  (assert (in (mangle "_;res|") s2))
   (assert (not (= s1 s2)))
 
   ;; defmacro/g! didn't like numbers initially because they
@@ -242,8 +242,8 @@
   (setv _ast2 (import_buffer_to_ast macro1 "foo"))
   (setv s1 (to_source _ast1))
   (setv s2 (to_source _ast2))
-  (assert (in "_;res|" s1))
-  (assert (in "_;res|" s2))
+  (assert (in (mangle "_;res|") s1))
+  (assert (in (mangle "_;res|") s2))
   (assert (not (= s1 s2)))
 
   ;; defmacro/g! didn't like numbers initially because they
Repository: hylang/hy

Issue:
"\n" isn't mangled appropriately
    => (mangle "\n")
    'hyx_XUnX'
    => (unmangle (mangle "\n"))
    Traceback (most recent call last):
    …
    ValueError: invalid literal for int() with base 16: 'n'



Discussion:

Resolving patch:
diff --git a/hy/lex/__init__.py b/hy/lex/__init__.py
--- a/hy/lex/__init__.py
+++ b/hy/lex/__init__.py
@@ -61,7 +61,10 @@ def mangle(s):
     according to Hy's mangling rules."""
     def unicode_char_to_hex(uchr):
         # Covert a unicode char to hex string, without prefix
-        return uchr.encode('unicode-escape').decode('utf-8').lstrip('\\U').lstrip('\\u').lstrip('0')
+        if len(uchr) == 1 and ord(uchr) < 128:
+            return format(ord(uchr), 'x')
+        return (uchr.encode('unicode-escape').decode('utf-8')
+            .lstrip('\\U').lstrip('\\u').lstrip('\\x').lstrip('0'))
 
     assert s
 


Test patch:
diff --git a/tests/native_tests/mangling.hy b/tests/native_tests/mangling.hy
--- a/tests/native_tests/mangling.hy
+++ b/tests/native_tests/mangling.hy
@@ -158,6 +158,27 @@
     (assert (= (mangle a) b))
     (assert (= (unmangle b) a))))
 
+
+(defn test-nongraphic []
+  ; https://github.com/hylang/hy/issues/1694
+
+  (assert (= (mangle " ") "hyx_XspaceX"))
+  (assert (= (mangle "\a") "hyx_XU7X"))
+  (assert (= (mangle "\t") "hyx_XU9X"))
+  (assert (= (mangle "\n") "hyx_XUaX"))
+  (assert (= (mangle "\r") "hyx_XUdX"))
+  (assert (= (mangle "\r") "hyx_XUdX"))
+
+  (setv c (try unichr (except [NameError] chr)))
+  (assert (= (mangle (c 127)) "hyx_XU7fX"))
+  (assert (= (mangle (c 128)) "hyx_XU80X"))
+  (assert (= (mangle (c 0xa0)) "hyx_XnoHbreak_spaceX"))
+  (assert (= (mangle (c 0x378)) "hyx_XU378X"))
+  (assert (= (mangle (c 0x200a) "hyx_Xhair_spaceX")))
+  (assert (= (mangle (c 0x2065)) "hyx_XU2065X"))
+  (assert (= (mangle (c 0x1000c)) "hyx_XU1000cX")))
+
+
 (defn test-mangle-bad-indent []
   ; Shouldn't crash with IndentationError
   (mangle "  0\n 0"))
Repository: hylang/hy

Issue:
F-strings are evaluated in (quote …)
`'f"{a}"` raises `NameError: name 'a' is not defined`.


Discussion:

Resolving patch:
diff --git a/hy/compiler.py b/hy/compiler.py
--- a/hy/compiler.py
+++ b/hy/compiler.py
@@ -606,9 +606,15 @@ def _render_quoted_form(self, form, level):
 
         elif isinstance(form, HyString):
             if form.is_format:
-               body.extend([HyKeyword("is_format"), form.is_format])
+                # Ensure that this f-string isn't evaluated right now.
+                body = [
+                    copy.copy(form),
+                    HyKeyword("is_format"),
+                    form.is_format,
+                ]
+                body[0].is_format = False
             if form.brackets is not None:
-               body.extend([HyKeyword("brackets"), form.brackets])
+                body.extend([HyKeyword("brackets"), form.brackets])
 
         ret = HyExpression([HySymbol(name)] + body).replace(form)
         return imports, ret, False


Test patch:
diff --git a/tests/native_tests/language.hy b/tests/native_tests/language.hy
--- a/tests/native_tests/language.hy
+++ b/tests/native_tests/language.hy
@@ -1303,7 +1303,16 @@ cee\"} dee" "ey bee\ncee dee"))
   ; Format bracket strings
   (assert (= #[f[a{p !r :9}]f] "a'xyzzy'  "))
   (assert (= #[f-string[result: {value :{width}.{precision}}]f-string]
-    "result:      12.34")))
+    "result:      12.34"))
+
+  ; Quoting shouldn't evaluate the f-string immediately
+  ; https://github.com/hylang/hy/issues/1844
+  (setv quoted 'f"hello {world}")
+  (assert quoted.is-format)
+  (with [(pytest.raises NameError)]
+    (eval quoted))
+  (setv world "goodbye")
+  (assert (= (eval quoted) "hello goodbye")))
 
 
 (defn test-import-syntax []
Repository: hylang/hy

Issue:
`lfor` can't see an imported name in `hy -c`
This one is deeply bizarre.

```
$ CODE='(import math) (print (lfor j [1] (math.sqrt 5)))' 
$ hy -c "$CODE"
Traceback (most recent call last):
  File "/usr/local/bin/hy", line 8, in <module>
    sys.exit(hy_main())
  File "<string>", line 1, in <module>
  File "<string>", line 1, in <listcomp>
NameError: name 'math' is not defined
$ echo "$CODE" | hy           
hy 0.18.0 using CPython(default) 3.7.5 on Linux
=> [2.23606797749979]
=> 
now exiting HyREPL...
$ echo "$CODE" > /tmp/foo.hy && hy /tmp/foo.hy 
[2.23606797749979]
```


Discussion:
A simpler demonstration of the problem is `hy -c '(setv x 3) (defn f [] x) (print (f))'`.

Resolving patch:
diff --git a/hy/cmdline.py b/hy/cmdline.py
--- a/hy/cmdline.py
+++ b/hy/cmdline.py
@@ -429,7 +429,7 @@ def run_command(source, filename=None):
         return 1
 
     with filtered_hy_exceptions():
-        hy_eval(tree, None, __main__, filename=filename, source=source)
+        hy_eval(tree, __main__.__dict__, __main__, filename=filename, source=source)
     return 0
 
 


Test patch:
diff --git a/tests/test_bin.py b/tests/test_bin.py
--- a/tests/test_bin.py
+++ b/tests/test_bin.py
@@ -266,6 +266,10 @@ def test_bin_hy_cmd():
     _, err = run_cmd("hy -c \"(koan\"", expect=1)
     assert "Premature end of input" in err
 
+    # https://github.com/hylang/hy/issues/1879
+    output, _ = run_cmd(
+        """hy -c '(setv x "bing") (defn f [] (+ "fiz" x)) (print (f))'""")
+    assert 'fizbing' in output
 
 def test_bin_hy_icmd():
     output, _ = run_cmd("hy -i \"(koan)\"", "(ideas)")
Repository: hylang/hy

Issue:
Can't `hy.eval` a `require` form in Python
I'm getting an error when doing a `require` using the `hy.eval` functionality.

The version of python works when hy is loaded:

```
hy 0.18.0 using CPython(default) 3.7.5 on Darwin                                                                                                                                
=> (require  [hy.contrib.walk [let]])                                                                                                                                           
True
```  

but fails when doing the same thing in python.

```
$ python
Python 3.7.5 (default, Jun  8 2020, 17:36:22) 
[Clang 11.0.3 (clang-1103.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import hy
>>> hy.eval(hy.read_str("(require  [hy.contrib.walk [let]])"))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/chris/.pyenv/versions/3.7.5/lib/python3.7/site-packages/hy/compiler.py", line 2099, in hy_eval
    module.__dict__, locals)
  File "<string>", line 1, in <module>
  File "/Users/chris/.pyenv/versions/3.7.5/lib/python3.7/site-packages/hy/macros.py", line 170, in require
    if _same_modules(source_module, target_module):
  File "/Users/chris/.pyenv/versions/3.7.5/lib/python3.7/site-packages/hy/macros.py", line 118, in _same_modules
    target_filename = _get_filename(target_module)
  File "/Users/chris/.pyenv/versions/3.7.5/lib/python3.7/site-packages/hy/macros.py", line 109, in _get_filename
    filename = loader.get_filename()
AttributeError: type object 'BuiltinImporter' has no attribute 'get_filename'
```


Discussion:
`(hy.eval (hy.read_str "(require  [hy.contrib.walk [let]])"))` seems to work fine in Hy. The bug you found is in using `hy.eval` from Python.
I really need a workaround for it because I'm doing these calls from [jep](https://github.com/ninia/jep) and I'd really like to use the `let` macro.
If you're targeting the JVM, wouldn't you be better off with Clojure than Hy?
I am using clojure, the project is for better interoperability with python.

Resolving patch:
diff --git a/hy/macros.py b/hy/macros.py
--- a/hy/macros.py
+++ b/hy/macros.py
@@ -105,7 +105,7 @@ def _get_filename(module):
         try:
             if not inspect.ismodule(module):
                 loader = pkgutil.get_loader(module)
-                if loader:
+                if isinstance(loader, importlib.machinery.SourceFileLoader):
                     filename = loader.get_filename()
             else:
                 filename = inspect.getfile(module)


Test patch:
diff --git a/tests/importer/test_importer.py b/tests/importer/test_importer.py
--- a/tests/importer/test_importer.py
+++ b/tests/importer/test_importer.py
@@ -289,3 +289,9 @@ def test_docstring():
         assert mod.a == 1
     finally:
         sys.path.pop(0)
+
+
+def test_hy_python_require():
+    # https://github.com/hylang/hy/issues/1911
+    test = "(do (require [tests.resources.macros [test-macro]]) (test-macro) blah)"
+    assert hy.eval(hy.read_str(test)) == 1
Repository: hylang/hy

Issue:
HyKeyword __getstate__ w.r.t. pickle
In approximately 0.14, this worked:
```(with [f (open "test.pickle" "w")] (pickle.dump {:a 1} f))```
In 0.16 one gets:
```TypeError: a class that defines __slots__ without defining __getstate__ cannot be pickled```
because HyKeyword does not implement `__getstate__`. This is with
```hy 0.16.0 using CPython(default) 2.7.7 on Linux```


Discussion:
I  think that the use of `__slots__` is basically a micro-optimization, anyway, so perhaps we should drop it.
This bug is no longer so obvious because the default pickle protocol is newer in newer versions of Python, but you can still see it with `:protocol 0`.

Resolving patch:
diff --git a/hy/models.py b/hy/models.py
--- a/hy/models.py
+++ b/hy/models.py
@@ -50,12 +50,12 @@ class HyObject(object):
     `abc` starting at the first column would have `start_column` 1 and
     `end_column` 3.
     """
-    __properties__ = ["module", "start_line", "end_line", "start_column",
-                      "end_column"]
+    properties = ["module", "start_line", "end_line", "start_column",
+                  "end_column"]
 
     def replace(self, other, recursive=False):
         if isinstance(other, HyObject):
-            for attr in self.__properties__:
+            for attr in self.properties:
                 if not hasattr(self, attr) and hasattr(other, attr):
                     setattr(self, attr, getattr(other, attr))
         else:
@@ -176,6 +176,15 @@ def __call__(self, data, default=_sentinel):
                 raise
             return default
 
+    # __getstate__ and __setstate__ are required for Pickle protocol
+    # 0, because we have __slots__.
+    def __getstate__(self):
+        return {k: getattr(self, k)
+            for k in self.properties + self.__slots__
+            if hasattr(self, k)}
+    def __setstate__(self, state):
+        for k, v in state.items():
+            setattr(self, k, v)
 
 def strip_digit_separators(number):
     # Don't strip a _ or , if it's the first character, as _42 and


Test patch:
diff --git a/tests/native_tests/language.hy b/tests/native_tests/language.hy
--- a/tests/native_tests/language.hy
+++ b/tests/native_tests/language.hy
@@ -7,6 +7,7 @@
         [sys :as systest]
         re
         [operator [or_]]
+        pickle
         [hy.errors [HyLanguageError]]
         pytest)
 (import sys)
@@ -1140,6 +1141,12 @@
   (assert (!= : ":"))
   (assert (= (name ':) "")))
 
+(defn test-pickling-keyword []
+  ; https://github.com/hylang/hy/issues/1754
+  (setv x :test-keyword)
+  (for [protocol (range 0 (+ pickle.HIGHEST-PROTOCOL 1))]
+    (assert (= x
+      (pickle.loads (pickle.dumps x :protocol protocol))))))
 
 (defn test-nested-if []
   "NATIVE: test nested if"
Repository: hylang/hy

Issue:
Make hy-history location configurable
How about an environment variable like `HY_HISTORY` that allows the user to change the location of `~/.hy-history`.


Discussion:

Resolving patch:
diff --git a/hy/completer.py b/hy/completer.py
--- a/hy/completer.py
+++ b/hy/completer.py
@@ -117,7 +117,8 @@ def completion(completer=None):
         readline.set_completer(completer.complete)
         readline.set_completer_delims(delims)
 
-        history = os.path.expanduser("~/.hy-history")
+        history = os.environ.get(
+            "HY_HISTORY", os.path.expanduser("~/.hy-history"))
         readline.parse_and_bind("set blink-matching-paren on")
 
         try:


Test patch:
diff --git a/tests/test_completer.py b/tests/test_completer.py
new file mode 100644
--- /dev/null
+++ b/tests/test_completer.py
@@ -0,0 +1,26 @@
+import os
+import sys
+from hy.completer import completion
+import pytest
+import tempfile
+
+
+@pytest.mark.skipif(
+    "readline" not in sys.modules,
+    reason="Module 'readline' is not available.")
+def test_history_custom_location():
+    import readline
+
+    expected_entry = '(print "Hy, custom history file!")'
+
+    with tempfile.TemporaryDirectory() as tmp:
+        history_location = tmp + os.sep + ".hy-custom-history"
+        os.environ["HY_HISTORY"] = history_location
+
+        with completion():
+            readline.clear_history()
+            readline.add_history(expected_entry)
+
+        with open(history_location, "r") as hf:
+            actual_entry = hf.readline()
+            assert expected_entry in actual_entry
Repository: hylang/hy

Issue:
HYSTARTUP affects tests
Errors in `tests/test_bin.hy` if HYSTARTUP is set, and even more errors if it loads a valid `.hy` file that sets the different startup options.

Separately, it looks like there aren't any tests for the HYSTARTUP feature itself? Or at least none that I could find with a quick grep.


Discussion:

Resolving patch:
diff --git a/conftest.py b/conftest.py
--- a/conftest.py
+++ b/conftest.py
@@ -10,6 +10,9 @@
 
 _fspath_pyimport = py.path.local.pyimport
 
+# https://github.com/hylang/hy/issues/2029
+os.environ.pop("HYSTARTUP", None)
+
 
 def pytest_ignore_collect(path, config):
     return (("py3_8_only" in path.basename and not PY3_8) or None)
diff --git a/hy/cmdline.py b/hy/cmdline.py
--- a/hy/cmdline.py
+++ b/hy/cmdline.py
@@ -248,6 +248,7 @@ def __init__(self, spy=False, output_fn=None, locals=None,
                 loader = HyLoader("__hystartup__", os.environ.get("HYSTARTUP"))
                 spec = importlib.util.spec_from_loader(loader.name, loader)
                 mod = importlib.util.module_from_spec(spec)
+                sys.modules.setdefault(mod.__name__, mod)
                 loader.exec_module(mod)
                 imports = mod.__dict__.get(
                     '__all__',


Test patch:
diff --git a/tests/resources/hystartup.hy b/tests/resources/hystartup.hy
new file mode 100644
--- /dev/null
+++ b/tests/resources/hystartup.hy
@@ -0,0 +1,8 @@
+(import [hy.contrib.hy-repr [hy-repr]]
+        os)
+
+(setv repl-spy True
+      repl-output-fn hy-repr)
+
+(defmacro hello-world []
+  `(+ 1 1))
diff --git a/tests/test_bin.py b/tests/test_bin.py
--- a/tests/test_bin.py
+++ b/tests/test_bin.py
@@ -599,3 +599,15 @@ def req_err(x):
     error_lines = error.splitlines()
     assert error_lines[-2] == '  File "<string>", line 1, in <module>'
     assert error_lines[-1].startswith('TypeError')
+
+
+def test_hystartup():
+    os.environ["HYSTARTUP"] = "tests/resources/hystartup.hy"
+    output, _ = run_cmd("hy", "[1 2]")
+    assert "[1 2]" in output
+    assert "[1, 2]" in output
+
+    output, _ = run_cmd("hy", "(hello-world)")
+    assert "(hello-world)" not in output
+    assert "1 + 1" in output
+    assert "2" in output
Repository: hylang/hy

Issue:
The manual is missing module names
It looks like the big doc reorganization ended up omitting the actual module names of the various contrib and extra modules; for example, the section named "Walk" documents the functions and macros in `hy.contrib.walk`, but doesn't mention the name `hy.contrib.walk` or otherwise indicate how to bring the enumerated names into scope.

Pointed out in https://github.com/hylang/hy/issues/2065#issuecomment-842377526.


Discussion:
good catch! I'll open a pr to fix it 
@allison-casey I think there may be a related bug in the Hy domain for Sphinx: `autofunction` and friends don't include the module name in the generated documentation, so `hy:autofunction:: hy.eval` names the function `eval`, instead of `hy.eval` as Sphinx does for Python.
yeah that's a byproduct of having `add_module_names = True` in `conf.py`. I set it to do that since we had a lot more auto imported stuff, but i was gonna remove it and just add notes to the beginning of the `core` api section and the beginning of the `extra/contrib` section in the pr to close this one. Unfortunately there's no way to do this per method its all or nothing
Changing it should be fine now that we're getting rid of various auto-imports.

Resolving patch:
diff --git a/docs/conf.py b/docs/conf.py
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -40,7 +40,7 @@
     hy_descriptive_version += " <strong style='color: red;'>(unstable)</strong>"
 
 exclude_patterns = ['_build', 'coreteam.rst']
-add_module_names = False
+add_module_names = True
 
 pygments_style = 'sphinx'
 


Test patch:
Repository: hylang/hy

Issue:
Run REPL using `python -m hy`
Figuring out how to get a REPL is not trivial. What do you think about making `python -m hy` do it?


Discussion:
The command `hy` seems straightforward enough, and is analogous with Python. Why would you want another route to the same end?
I didn't realize there is a `hy` command. I installed Hy from `pip` and there isn't one in my `PATH`. I've used `import hy.cmdline` and `hy.cmdline.run_repl()`. It's a minor convention for `python -m` to do something useful, perhaps most famously `python -m SimpleHTTPServer` to serve the current directory over HTTP.
>  I installed Hy from `pip` and there isn't one in my `PATH`

That sounds like a bug, although it's hard to guess whether the bug is in pip or Hy. Can you reproduce this issue in a virtualenv?
Cannot reproduce. This works fine:

```Shell
python3 -m venv .venv
. .venv/bin/activate
pip3 install hy
hy
```

You should consider adding the `-m` alternative though - as seen above, `venv` is another useful tool that does it :)

Resolving patch:
diff --git a/hy/__main__.py b/hy/__main__.py
--- a/hy/__main__.py
+++ b/hy/__main__.py
@@ -1,14 +1,8 @@
-import hy  # NOQA
 import sys
 
-# This just mocks the normalish behavior of the Python interp. Helpful to aid
-# with shimming existing apps that don't really "work" with Hy.
-#
-# You could say this script helps Hyjack a file.
-#
+from hy.cmdline import hy_main
 
+# Running hy as a module (e.g. `python -m hy`)
+# is equivalent to running the main `hy` command.
 
-if len(sys.argv) > 1:
-    sys.argv.pop(0)
-    hy.importer._import_from_path('__main__', sys.argv[0])
-    sys.exit(0)  # right?
+sys.exit(hy_main())


Test patch:
Repository: hylang/hy

Issue:
Test return-value annotations



Discussion:
#2050 has added documentation, but we still need tests.

Resolving patch:
diff --git a/hy/compiler.py b/hy/compiler.py
--- a/hy/compiler.py
+++ b/hy/compiler.py
@@ -1469,8 +1469,8 @@ def compile_function_lambda(self, expr, root, returns, params, body):
         # return its name as the final expr
         return ret + Result(expr=ret.temp_variables[0])
 
-    @special(["defn", "defn/a"], [SYM, OPTIONAL_ANNOTATION, lambda_list, many(FORM)])
-    def compile_function_def(self, expr, root, name, returns, params, body):
+    @special(["defn", "defn/a"], [OPTIONAL_ANNOTATION, SYM, lambda_list, many(FORM)])
+    def compile_function_def(self, expr, root, returns, name, params, body):
         node = asty.FunctionDef if root == "defn" else asty.AsyncFunctionDef
         body = self._compile_branch(body)
 


Test patch:
diff --git a/tests/native_tests/language.hy b/tests/native_tests/language.hy
--- a/tests/native_tests/language.hy
+++ b/tests/native_tests/language.hy
@@ -870,9 +870,10 @@
 
 (defn test-defn-annotations []
 
-  (defn f [^int p1 p2 ^str p3 ^str [o1 None] ^int [o2 0]
+  (defn ^int f [^int p1 p2 ^str p3 ^str [o1 None] ^int [o2 0]
            ^str #* rest ^str k1 ^int [k2 0] ^bool #** kwargs])
 
+  (assert (is (. f __annotations__ ["return"]) int))
   (for [[k v] (.items (dict
       :p1 int  :p3 str  :o1 str  :o2 int
       :k1 str  :k2 int  :kwargs bool))]