diff --git a/anyloadump/__init__.py b/anyloadump/__init__.py
index b945f70..67c25d0 100644
--- a/anyloadump/__init__.py
+++ b/anyloadump/__init__.py
@@ -1,1 +1,2 @@
+__all__ = ["dump", "load"]
 from . import dump, load
diff --git a/anyloadump/dump.py b/anyloadump/dump.py
index 3297150..83de06f 100644
--- a/anyloadump/dump.py
+++ b/anyloadump/dump.py
@@ -1,33 +1,39 @@
 from .loadump import loadump, DumpMode
 
-def dump(obj, file, *, encoding=None, errors=None, **kwargs):
-    return loadump(obj=obj, dump_mode=DumpMode.WRITE, file=file, encoding=encoding, errors=errors, **kwargs)
+def dump(obj, file, *, encoding=None, errors=None, buffering=None, **kwargs):
+    return loadump(obj=obj, dump_mode=DumpMode.WRITE, file=file,
+                   encoding=encoding, errors=errors, buffering=buffering, **kwargs)
 
-def adump(obj, file, *, encoding=None, errors=None, **kwargs):
+def adump(obj, file, *, encoding=None, errors=None, buffering=None, **kwargs):
     return loadump(
         obj=obj,
         dump_mode=DumpMode.APPEND,
         file=file,
         encoding=encoding,
         errors=errors,
+        buffering=buffering,
         **kwargs
     )
 
-def xdump(obj, file, *, encoding=None, errors=None, **kwargs):
+def xdump(obj, file, *, encoding=None, errors=None, buffering=None, **kwargs):
     return loadump(
         obj=obj,
         dump_mode=DumpMode.EXCLUSIVE_CREATION,
         file=file,
         encoding=encoding,
         errors=errors,
+        buffering=buffering,
         **kwargs
     )
 
-def dumps(obj, *, encoding=None, errors=None, **kwargs):
-    return loadump(obj=obj, dump_mode=DumpMode.WRITE, encoding=encoding, errors=errors, **kwargs)
+def dumps(obj, *, encoding=None, errors=None, buffering=None, **kwargs):
+    return loadump(obj=obj, dump_mode=DumpMode.WRITE,
+                   encoding=encoding, errors=errors, buffering=buffering, **kwargs)
 
-def adumps(obj, *, encoding=None, errors=None, **kwargs):
-    return loadump(obj=obj, dump_mode=DumpMode.APPEND, encoding=encoding, errors=errors, **kwargs)
+def adumps(obj, *, encoding=None, errors=None, buffering=None, **kwargs):
+    return loadump(obj=obj, dump_mode=DumpMode.APPEND,
+                   encoding=encoding, errors=errors, buffering=buffering, **kwargs)
 
-def xdumps(obj, *, encoding=None, errors=None, **kwargs):
-    return loadump(obj=obj, dump_mode=DumpMode.EXCLUSIVE_CREATION, encoding=encoding, errors=errors, **kwargs)
+def xdumps(obj, *, encoding=None, errors=None, buffering=None, **kwargs):
+    return loadump(obj=obj, dump_mode=DumpMode.EXCLUSIVE_CREATION,
+                   encoding=encoding, errors=errors, buffering=buffering, **kwargs)
diff --git a/anyloadump/load.py b/anyloadump/load.py
index 6405744..19c5a04 100644
--- a/anyloadump/load.py
+++ b/anyloadump/load.py
@@ -1,4 +1,7 @@
 from .loadump import loadump, DumpMode
 
-def load(file, *, encoding=None, errors=None, **kwargs):
-    return loadump(DumpMode.READ, file=file, encoding=encoding, errors=errors, **kwargs)
+def load(filename, *, encoding=None, errors=None, buffering=None, **kwargs):
+    return loadump(DumpMode.READ, filename=filename, encoding=encoding, errors=errors, buffering=buffering, **kwargs)
+
+def loads(s, *, encoding=None, errors=None, buffering=None, **kwargs):
+    return loadump(DumpMode.READ, s=s, encoding=encoding, errors=errors, buffering=buffering, **kwargs)
diff --git a/anyloadump/loadump.py b/anyloadump/loadump.py
index a5944bf..813b8de 100644
--- a/anyloadump/loadump.py
+++ b/anyloadump/loadump.py
@@ -46,33 +46,33 @@ def _extract_extension(file):
 """
 may raise ExtensionInferenceError
 """
-def _invoke(dump_mode: DumpMode, file=None, fmt=None):
-    ext = _extract_extension(file) if file else fmt
+def _invoke(dump_mode: DumpMode, filename=None, fmt=None):
+    ext = _extract_extension(filename) if filename else fmt
     if ext is None: raise ExtensionNotInferredError
     target = importlib.import_module(ext)
-    logger.debug("module : {}".format(target))
     # "[load|dump]s?"
     method_mappings = dict(zip(list("rawx"), ["load"] + ["dump"] * 3))
-    return getattr(target, method_mappings[dump_mode.value] + 's' * (not file))
+    method = getattr(target, method_mappings[dump_mode.value] + 's' * (not filename))
+    logger.debug("module : {}, method : {}".format(target, method))
+    return method
 
 """
 generalized [load|dump]s? function
 """
-def loadump(dump_mode: DumpMode, *, obj=None, file=None, fmt = None, encoding=None, errors=None, **kwargs):
+def loadump(dump_mode: DumpMode, *,
+            obj=None, s=None, filename=None, fmt=None, encoding=None, errors=None, buffering=None, **kwargs):
+    # load method precedes loads
+    if obj is not None:
+        logger.warning("`obj` & `s` are both None, so `s` is forced to set None")
+        s=None
 
-    kwargs.update(
-        dict(
-            encoding=encoding,
-            errors=errors,
-            obj=obj,
-        )
-    )
-    kwargs = {k: v for k, v in kwargs if k is not None}
-
-    if file is None:
-        return _invoke(dump_mode=dump_mode, fmt=fmt)(**kwargs)
+    if filename is None:
+        return _invoke(dump_mode=dump_mode, fmt=fmt)(obj or s, **kwargs)
     else:
-        if not os.path.exists(file): raise FileNotFoundError
-        mode = dump_mode.value + ("b" if _is_binary(file) else "")
-        with codecs.open(file, mode=mode, encoding=encoding, errors=errors) as fp:
-            return _invoke(dump_mode=dump_mode, file=file, fmt=fmt)(fp=fp, **kwargs)
+        if not os.path.exists(filename): raise FileNotFoundError
+        mode = dump_mode.value + "b"*_is_binary(filename)
+        codecs_kwargs = \
+            {k:v for k,v in dict(mode=mode, encoding=encoding, errors=errors, buffering=buffering).items() \
+                if v is not None}
+        with codecs.open(filename=filename, **codecs_kwargs) as fp:
+            return _invoke(dump_mode=dump_mode, filename=filename, fmt=fmt)(fp, **kwargs)

test loadump.load module
test loadump.load module
see also #9
diff --git a/tests/test_load.py b/tests/test_load.py
new file mode 100644
index 0000000..1b19de1
--- /dev/null
+++ b/tests/test_load.py
@@ -0,0 +1,49 @@
+import unittest
+from anyloadump import load
+import os
+
+class LoadTests(unittest.TestCase):
+    def _get_path(self, file):
+        root_dir = os.path.dirname(os.path.abspath(__file__))
+        return os.path.join(root_dir, file)
+
+    def test_load(self):
+
+        import logging
+        logging.basicConfig(level=logging.ERROR)
+        logging.getLogger("anyloadump.loadump").setLevel(logging.DEBUG)
+        import json, pickle
+
+        # test text_file(json)
+        json_file = self._get_path("data/sample.json")
+        res = load.load(json_file)
+
+        with open(json_file, "r") as fi:
+            obj = json.load(fi)
+        self.assertEqual(res, obj)
+
+        # test binary_file(pickle)
+        pickle_file = self._get_path("data/sample.pickle")
+        res = load.load(
+            filename=pickle_file,
+        )
+
+        with open(pickle_file, "rb") as fi:
+            obj = pickle.load(fi)
+
+        self.assertEqual(res, obj)
+
+    def test_loads(self):
+        import logging
+        logging.basicConfig(level=logging.ERROR)
+        logging.getLogger("anyloadump.loadump").setLevel(logging.DEBUG)
+        import json, pickle
+
+        sample = [1,2,3]
+        s = json.dumps(sample)
+        res = load.loads(s, fmt="json") # test
+        self.assertEqual(res, sample)
+
+        b = pickle.dumps(sample)
+        res = load.loads(b, fmt="pickle")
+        self.assertEqual(res, sample)
diff --git a/tests/test_loadump.py b/tests/test_loadump.py
index 14b5921..2c9c60c 100644
--- a/tests/test_loadump.py
+++ b/tests/test_loadump.py
@@ -48,7 +48,7 @@ class LoadumpTests(unittest.TestCase):
         # check if func is json.dump function
         func = loadump._invoke(
             dump_mode=DumpMode.WRITE,
-            file = self._get_path("data/sample.json")
+            filename = self._get_path("data/sample.json")
         )
         self.assertTrue(hasattr(func, '__call__'))
         self.assertEqual(func.__module__, "json")
@@ -61,7 +61,7 @@ class LoadumpTests(unittest.TestCase):
         # check if func is json.load function
         func = loadump._invoke(
             dump_mode=DumpMode.READ,
-            file = self._get_path("data/sample.json")
+            filename = self._get_path("data/sample.json")
         )
         self.assertTrue(hasattr(func, '__call__'))
         self.assertEqual(func.__module__, "json")
@@ -75,7 +75,7 @@ class LoadumpTests(unittest.TestCase):
         pickle_file = "data/sample.pickle"
         func = loadump._invoke(
             dump_mode=DumpMode.READ,
-            file = self._get_path(pickle_file)
+            filename = self._get_path(pickle_file)
         )
         self.assertTrue(hasattr(func, '__call__'))
         self.assertEqual(func.__module__, "_pickle")
@@ -113,3 +113,7 @@ class LoadumpTests(unittest.TestCase):
             loadump._invoke(
                 dump_mode=DumpMode.READ,
             )
+
+    def test_loadump(self):
+        # generalized function, tests are described in dump or load module.
+        pass

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/knknkn1162/anyloadump.git@3aedfe9cfcee8481739b0a2effa3a1890c61a08f#egg=anyloadump
coverage==7.8.0
exceptiongroup==1.2.2
iniconfig==2.1.0
packaging==24.2
pluggy==1.5.0
pytest==8.3.5
pytest-cov==6.0.0
tomli==2.2.1

name: anyloadump
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - coverage==7.8.0
      - exceptiongroup==1.2.2
      - iniconfig==2.1.0
      - packaging==24.2
      - pluggy==1.5.0
      - pytest==8.3.5
      - pytest-cov==6.0.0
      - tomli==2.2.1
prefix: /opt/conda/envs/anyloadump

tests/test_load.py::LoadTests::test_loads tests/test_loadump.py::LoadumpTests::test_invoke
tests/test_load.py::LoadTests::test_load tests/test_loadump.py::LoadumpTests::test_is_binary
tests/test_loadump.py::LoadumpTests::test_extract_extension tests/test_loadump.py::LoadumpTests::test_loadump
anyloadump/__init__.py anyloadump/load.py anyloadump/loadump.py anyloadump/dump.py
anyloadump/__init__.py anyloadump/load.py anyloadump/loadump.py anyloadump/dump.py