SultanOrazbayev: This is a great feature! In terms of simplifying coding, do you think it might be better to switch to something like `from functools import partial` (see https://docs.python.org/2/library/functools.html)? This would obviate the need for the special keyword `allow_missing`.
johanneskoester: Thanks for the suggestion. I must say though that I don't see the use case. You can always mask the wildcards:
`assert expand("{a}_{{b}}.out", a=[1,2]) == ["1_{b}.out", "2_{b}.out"]`

troycomi: I typically keep my paths in the config and try to reference them in the workflow to keep everything DRY.  If my `outfile = '{a}_{b}.out'` I then have to do something like:
```python
expand(outfile.replace('b', '{b}'), a = [1, 2])
# or
expand(outfile, a=[1,2], b='{b}')
```
both obfuscate the code more and get repetitive if I have a lot of wildcards I *don't* want to format.

The other example is chaining combinators, as brought up by this [old issue](https://bitbucket.org/snakemake/snakemake/issues/1282/using-zip-for-some-but-not-all-wildcards).  The solution could now be rephrased as
```python
expand(
  expand('{tp}/compare/{name}vs{comp}', comp=sample_to_compare, allow_missing=True),
  tp=sample_name, comp=sample_to_compare, zip)
```

The [original issue](https://github.com/snakemake/snakemake/issues/124#issuecomment-558705885) also presented a use case where a partial expand would feed into listfiles or glob_wildcards.

I guess it's a convenience function for a corner case, but it would be a cleaner fix than format masking in complex examples.  It may (hopefully) prevent future issues asking for something similar.  If allow_missing isn't included in the kwargs it also doesn't add much overhead.
shenghuanjie: > Thanks for the suggestion. I must say though that I don't see the use case. You can always mask the wildcards:
> `assert expand("{a}_{{b}}.out", a=[1,2]) == ["1_{b}.out", "2_{b}.out"]`

This has also been discussed in [this](https://github.com/snakemake/snakemake/issues/124) issue.
Do you have any suggestions for a good workaround to the example mentioned in the issue?
sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug.png' alt='Bug' width='16' height='16' />](https://sonarcloud.io/project/issues?id=snakemake_snakemake&pullRequest=127&resolved=false&types=BUG) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=snakemake_snakemake&pullRequest=127&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=snakemake_snakemake&pullRequest=127&resolved=false&types=BUG)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability.png' alt='Vulnerability' width='16' height='16' />](https://sonarcloud.io/project/issues?id=snakemake_snakemake&pullRequest=127&resolved=false&types=VULNERABILITY) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=snakemake_snakemake&pullRequest=127&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=snakemake_snakemake&pullRequest=127&resolved=false&types=VULNERABILITY) (and [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot.png' alt='Security Hotspot' width='16' height='16' />](https://sonarcloud.io/project/issues?id=snakemake_snakemake&pullRequest=127&resolved=false&types=SECURITY_HOTSPOT) [3 Security Hotspots](https://sonarcloud.io/project/issues?id=snakemake_snakemake&pullRequest=127&resolved=false&types=SECURITY_HOTSPOT) to review)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell.png' alt='Code Smell' width='16' height='16' />](https://sonarcloud.io/project/issues?id=snakemake_snakemake&pullRequest=127&resolved=false&types=CODE_SMELL) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=snakemake_snakemake&pullRequest=127&resolved=false&types=CODE_SMELL) [5 Code Smells](https://sonarcloud.io/project/issues?id=snakemake_snakemake&pullRequest=127&resolved=false&types=CODE_SMELL)

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo.png' alt='No Coverage information' width='16' height='16' />](https://sonarcloud.io/component_measures?id=snakemake_snakemake&pullRequest=127) No Coverage information  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3.png' alt='0.4%' width='16' height='16' />](https://sonarcloud.io/component_measures?id=snakemake_snakemake&pullRequest=127&metric=new_duplicated_lines_density&view=list) [0.4% Duplication](https://sonarcloud.io/component_measures?id=snakemake_snakemake&pullRequest=127&metric=new_duplicated_lines_density&view=list)


diff --git a/docs/project_info/faq.rst b/docs/project_info/faq.rst
index 91321e44..e1ef4d2a 100644
--- a/docs/project_info/faq.rst
+++ b/docs/project_info/faq.rst
@@ -100,6 +100,25 @@ In order to infer the IDs from present files, Snakemake provides the ``glob_wild
 
 The function matches the given pattern against the files present in the filesystem and thereby infers the values for all wildcards in the pattern. A named tuple that contains a list of values for each wildcard is returned. Here, this named tuple has only one item, that is the list of values for the wildcard ``{id}``.
 
+I don't want expand to use the product of every wildcard, what can I do?
+------------------------------------------------------------------------
+
+By default the expand function uses ``itertools.product`` to create every combination of the supplied wildcards.
+Expand takes an optional, second positional argument which can customize how wildcards are combined.
+To create the list ``["a_1.txt", "b_2.txt", "c_3.txt"]``, invoke expand as:
+``expand("{sample}_{id}.txt", zip, sample=["a", "b", "c"], id=["1", "2", "3"])``
+
+I don't want expand to use every wildcard, what can I do?
+---------------------------------------------------------
+
+Sometimes partially expanding wildcards is useful to define inputs which still depend on some wildcards.
+Expand takes an optional keyword argument, allow_missing=True, that will format only wildcards which are supplied, leaving others as is.
+To create the list ``["{sample}_1.txt", "{sample}_2.txt"]``, invoke expand as:
+``expand("{sample}_{id}.txt", id=["1", "2"], allow_missing=True)``
+If the filename contains the wildcard ``allow_missing``, it will be formatted normally:
+``expand("{allow_missing}.txt", allow_missing=True)`` returns ``["True.txt"]``.
+
+
 Snakemake complains about a cyclic dependency or a PeriodicWildcardError. What can I do?
 ----------------------------------------------------------------------------------------
 
diff --git a/snakemake/io.py b/snakemake/io.py
index fd7d5dda..a976a9e9 100755
--- a/snakemake/io.py
+++ b/snakemake/io.py
@@ -17,6 +17,7 @@ import functools
 import subprocess as sp
 from itertools import product, chain
 from contextlib import contextmanager
+import string
 import collections
 
 import yaml
@@ -892,7 +893,8 @@ def expand(*args, **wildcards):
         second arg (optional): a function to combine wildcard values
         (itertools.product per default)
     **wildcards -- the wildcards as keyword arguments
-        with their values as lists
+        with their values as lists. If allow_missing=True is included
+        wildcards in filepattern without values will stay unformatted.
     """
     filepatterns = args[0]
     if len(args) == 1:
@@ -916,12 +918,27 @@ def expand(*args, **wildcards):
             "of expand (e.g. 'temp(expand(\"plots/{sample}.pdf\", sample=SAMPLES))')."
         )
 
+    # check if remove missing is provided
+    format_dict = dict
+    if "allow_missing" in wildcards and wildcards["allow_missing"] is True:
+
+        class FormatDict(dict):
+            def __missing__(self, key):
+                return "{" + key + "}"
+
+        format_dict = FormatDict
+        # check that remove missing is not a wildcard in the filepatterns
+        for filepattern in filepatterns:
+            if "allow_missing" in re.findall(r"{([^}\.[!:]+)", filepattern):
+                format_dict = dict
+                break
+
     # remove unused wildcards to avoid duplicate filepatterns
     wildcards = {
         filepattern: {
             k: v
             for k, v in wildcards.items()
-            if k in re.findall("{([^}\.[!:]+)", filepattern)
+            if k in re.findall(r"{([^}\.[!:]+)", filepattern)
         }
         for filepattern in filepatterns
     }
@@ -934,11 +951,12 @@ def expand(*args, **wildcards):
                 values = [values]
             yield [(wildcard, value) for value in values]
 
+    formatter = string.Formatter()
     try:
         return [
-            filepattern.format(**comb)
+            formatter.vformat(filepattern, (), comb)
             for filepattern in filepatterns
-            for comb in map(dict, combinator(*flatten(wildcards[filepattern])))
+            for comb in map(format_dict, combinator(*flatten(wildcards[filepattern])))
         ]
     except KeyError as e:
         raise WildcardError("No values given for wildcard {}.".format(e))
@@ -1050,7 +1068,7 @@ def update_wildcard_constraints(
 
 
 def split_git_path(path):
-    file_sub = re.sub("^git\+file:/+", "/", path)
+    file_sub = re.sub(r"^git\+file:/+", "/", path)
     (file_path, version) = file_sub.split("@")
     file_path = os.path.realpath(file_path)
     root_path = get_git_root(file_path)

A utility function to partially format strings with wildcards
**Is your feature request related to a problem? Please describe.**
In the workflow, we usually need to deal with multiple wildcards.
It would be nice if there is a function to partially format the input string with multiple wildcards.
Maybe this function already exists and I'm just not aware of it.
For example:
```
foo = "{a}_{b}.txt"
result = format_cards(foo, a="foo")
print(result)
# result = "foo_{b}.txt"
```

**Describe the solution you'd like**
Here is a [solution](https://stackoverflow.com/questions/11283961/partial-string-formatting) I found on StackOverflow.
```
def format_cards(template, **kwargs):
    import string
    class FormatDict(dict):
        def __missing__(self, key):
        return "{" + key + "}"
    formatter = string.Formatter()
    mapping = FormatDict(**kwarg)
    return formatter.vformat(template, (), mapping)
```


diff --git a/tests/test_expand.py b/tests/test_expand.py
new file mode 100644
index 00000000..8094a38b
--- /dev/null
+++ b/tests/test_expand.py
@@ -0,0 +1,67 @@
+from snakemake.io import expand
+from snakemake.exceptions import WildcardError
+import pytest
+
+
+def test_simple_expand():
+    # single filepattern
+    assert expand("{a}.out", a="test") == ["test.out"]
+    # multiple filepatterns
+    assert expand(["{a}.out", "{b}.out"], a="a", b="b") == ["a.out", "b.out"]
+    # multiple wildcards
+    assert expand("{a}.out", a=["1", "2", "3"]) == ["1.out", "2.out", "3.out"]
+    # multiple wildcards and patterns
+    assert expand(["{a}_{b}.ab", "{b}.b"], a="1 2".split(), b="3 4".split()) == [
+        "1_3.ab",
+        "1_4.ab",
+        "2_3.ab",
+        "2_4.ab",
+        "3.b",
+        "4.b",
+    ]
+    # replace product
+    assert expand(["{a}_{b}.ab", "{b}.b"], zip, a="1 2".split(), b="3 4".split()) == [
+        "1_3.ab",
+        "2_4.ab",
+        "3.b",
+        "4.b",
+    ]
+
+
+def test_allow_missing():
+    # single filepattern
+    assert expand("{a}_{b}.out", allow_missing=True) == ["{a}_{b}.out"]
+    assert expand("{a}_{b}.out", a="test", allow_missing=True) == ["test_{b}.out"]
+    # none missing
+    assert expand("{a}.out", a="test", allow_missing=True) == ["test.out"]
+    # wildcard is allow_missing
+    assert expand("{allow_missing}.out", allow_missing=True) == ["True.out"]
+    # allow_missing not True
+    assert expand("{a}.out", a="test", allow_missing="test2") == ["test.out"]
+    with pytest.raises(WildcardError) as e:
+        expand("{a}.out", allow_missing="test2")
+    assert str(e.value) == "No values given for wildcard 'a'."
+
+    # multiple filepatterns
+    assert expand(["{a}.out", "{b}.out"], allow_missing=True) == ["{a}.out", "{b}.out"]
+    # multiple wildcards
+    assert expand("{a}_{b}.out", a=["1", "2", "3"], allow_missing=True) == [
+        "1_{b}.out",
+        "2_{b}.out",
+        "3_{b}.out",
+    ]
+    # multiple wildcards and patterns
+    assert expand(
+        ["{a}_{b}_{C}.ab", "{b}_{c}.b"],
+        a="1 2".split(),
+        b="3 4".split(),
+        allow_missing=True,
+    ) == ["1_3_{C}.ab", "1_4_{C}.ab", "2_3_{C}.ab", "2_4_{C}.ab", "3_{c}.b", "4_{c}.b"]
+    # replace product
+    assert expand(
+        ["{a}_{b}_{C}.ab", "{b}_{c}.b"],
+        zip,
+        a="1 2".split(),
+        b="3 4".split(),
+        allow_missing=True,
+    ) == ["1_3_{C}.ab", "2_4_{C}.ab", "3_{c}.b", "4_{c}.b"]

environment.yml
pip install -e .
parse_log_pytest
environment.yml
pytest
apt-get update apt-get install -y wget bzip2 ca-certificates gnupg2 squashfs-tools git
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
aiohttp @ file:///home/conda/feedstock_root/build_artifacts/aiohttp_1636085288765/work
appdirs @ file:///home/conda/feedstock_root/build_artifacts/appdirs_1733753955715/work
async-timeout==3.0.1
attrs @ file:///home/conda/feedstock_root/build_artifacts/attrs_1741918516150/work
aws-xray-sdk @ file:///home/conda/feedstock_root/build_artifacts/aws-xray-sdk_1733852228893/work
azure-common @ file:///home/conda/feedstock_root/build_artifacts/azure-common_1733835805040/work
azure-storage==0.36.0
azure-storage-common @ file:///home/conda/feedstock_root/build_artifacts/azure-storage-common_1726774381352/work
bcrypt @ file:///home/conda/feedstock_root/build_artifacts/bcrypt_1651441533234/work
blinker @ file:///home/conda/feedstock_root/build_artifacts/blinker_1731096409132/work
boto3 @ file:///home/conda/feedstock_root/build_artifacts/boto3_1743235439640/work
botocore @ file:///home/conda/feedstock_root/build_artifacts/botocore_1743212919739/work
Brotli @ file:///home/conda/feedstock_root/build_artifacts/brotli-split_1648883617327/work
cachetools @ file:///home/conda/feedstock_root/build_artifacts/cachetools_1740094013202/work
certifi @ file:///home/conda/feedstock_root/build_artifacts/certifi_1739515848642/work/certifi
cffi @ file:///home/conda/feedstock_root/build_artifacts/cffi_1636046055389/work
chardet @ file:///home/conda/feedstock_root/build_artifacts/chardet_1649184154184/work
charset-normalizer @ file:///home/conda/feedstock_root/build_artifacts/charset-normalizer_1735929714516/work
click @ file:///home/conda/feedstock_root/build_artifacts/click_1734858813237/work
ConfigArgParse @ file:///home/conda/feedstock_root/build_artifacts/configargparse_1734442768208/work
cryptography @ file:///croot/cryptography_1740577825284/work
datrie @ file:///home/conda/feedstock_root/build_artifacts/datrie_1636388972619/work
defusedxml @ file:///home/conda/feedstock_root/build_artifacts/defusedxml_1615232257335/work
docutils @ file:///home/conda/feedstock_root/build_artifacts/docutils_1733217766141/work
dropbox @ file:///home/conda/feedstock_root/build_artifacts/dropbox_1734953437402/work
exceptiongroup==1.2.2
fastjsonschema @ file:///home/conda/feedstock_root/build_artifacts/python-fastjsonschema_1733235979760/work/dist
Flask @ file:///home/conda/feedstock_root/build_artifacts/flask_1741793020411/work
flask-cors @ file:///home/conda/feedstock_root/build_artifacts/bld/rattler-build_flask-cors_1740437019/work
ftputil @ file:///home/conda/feedstock_root/build_artifacts/ftputil_1704576504134/work
gitdb @ file:///home/conda/feedstock_root/build_artifacts/gitdb_1735887193964/work
GitPython @ file:///home/conda/feedstock_root/build_artifacts/gitpython_1735929639977/work
google-api-core @ file:///home/conda/feedstock_root/build_artifacts/google-api-core-split_1741643016905/work
google-auth @ file:///home/conda/feedstock_root/build_artifacts/google-auth_1737618250101/work
google-cloud-core @ file:///home/conda/feedstock_root/build_artifacts/google-cloud-core_1741676080456/work
google-cloud-storage @ file:///home/conda/feedstock_root/build_artifacts/google-cloud-storage_1740725233049/work
google-crc32c @ file:///home/conda/feedstock_root/build_artifacts/google-crc32c_1651517222116/work
google-resumable-media @ file:///home/conda/feedstock_root/build_artifacts/google-resumable-media_1733728468631/work
googleapis-common-protos @ file:///home/conda/feedstock_root/build_artifacts/googleapis-common-protos-feedstock_1742265914556/work
grpcio @ file:///croot/grpc-split_1742490263735/work
httpretty @ file:///home/conda/feedstock_root/build_artifacts/httpretty_1734512555851/work
idna @ file:///home/conda/feedstock_root/build_artifacts/idna_1733211830134/work
importlib_metadata @ file:///home/conda/feedstock_root/build_artifacts/importlib-metadata_1737420181517/work
importlib_resources @ file:///home/conda/feedstock_root/build_artifacts/importlib_resources_1736252299705/work
iniconfig==2.1.0
itsdangerous @ file:///home/conda/feedstock_root/build_artifacts/itsdangerous_1733308265247/work
Jinja2 @ file:///home/conda/feedstock_root/build_artifacts/jinja2_1741263328855/work
jmespath @ file:///home/conda/feedstock_root/build_artifacts/jmespath_1733229141657/work
joserfc @ file:///home/conda/feedstock_root/build_artifacts/joserfc_1740767085887/work
jsondiff @ file:///home/conda/feedstock_root/build_artifacts/jsondiff_1735929067601/work
jsonschema @ file:///home/conda/feedstock_root/build_artifacts/jsonschema_1733472696581/work
jsonschema-path @ file:///home/conda/feedstock_root/build_artifacts/bld/rattler-build_jsonschema-path_1737837054/work
jsonschema-specifications @ file:///tmp/tmpk0f344m9/src
jupyter_core @ file:///home/conda/feedstock_root/build_artifacts/jupyter_core_1727163409502/work
lazy-object-proxy @ file:///home/conda/feedstock_root/build_artifacts/lazy-object-proxy_1649033163570/work
MarkupSafe @ file:///home/conda/feedstock_root/build_artifacts/markupsafe_1648737556467/work
moto @ file:///home/conda/feedstock_root/build_artifacts/moto_1743404414192/work
multidict @ file:///home/conda/feedstock_root/build_artifacts/multidict_1648882420423/work
nbformat @ file:///home/conda/feedstock_root/build_artifacts/nbformat_1733402752141/work
networkx @ file:///home/conda/feedstock_root/build_artifacts/networkx_1698504735452/work
numpy @ file:///home/conda/feedstock_root/build_artifacts/numpy_1651020388495/work
openapi-schema-validator @ file:///home/conda/feedstock_root/build_artifacts/openapi-schema-validator_1736695131485/work
openapi-spec-validator @ file:///home/conda/feedstock_root/build_artifacts/openapi-spec-validator_1733408417628/work
packaging==24.2
pandas==1.4.2
paramiko @ file:///home/conda/feedstock_root/build_artifacts/paramiko_1738679121080/work
pathable @ file:///home/conda/feedstock_root/build_artifacts/pathable_1736621665969/work/dist
pkgutil_resolve_name @ file:///home/conda/feedstock_root/build_artifacts/pkgutil-resolve-name_1733344503739/work
platformdirs @ file:///home/conda/feedstock_root/build_artifacts/bld/rattler-build_platformdirs_1742485085/work
pluggy==1.5.0
ply @ file:///home/conda/feedstock_root/build_artifacts/ply_1733239724146/work
prettytable @ file:///home/conda/feedstock_root/build_artifacts/prettytable_1742905810855/work
proto-plus @ file:///home/conda/feedstock_root/build_artifacts/proto-plus_1741676149446/work
protobuf @ file:///croot/protobuf_1742419705443/work/bazel-bin/python/dist/protobuf-5.29.3-cp39-abi3-linux_x86_64.whl#sha256=99e7f032b8e72c85dbc84c9a250d19a4af2aeca12410c10349432035adb74ba0
psutil @ file:///home/conda/feedstock_root/build_artifacts/psutil_1653089170447/work
pyasn1 @ file:///home/conda/feedstock_root/build_artifacts/pyasn1_1733217608156/work
pyasn1_modules @ file:///home/conda/feedstock_root/build_artifacts/pyasn1-modules_1733324602540/work
pycparser @ file:///home/conda/feedstock_root/build_artifacts/bld/rattler-build_pycparser_1733195786/work
Pygments @ file:///home/conda/feedstock_root/build_artifacts/pygments_1736243443484/work
pygraphviz @ file:///home/conda/feedstock_root/build_artifacts/pygraphviz_1644545949669/work
PyNaCl @ file:///home/conda/feedstock_root/build_artifacts/pynacl_1649519974080/work
pyOpenSSL @ file:///home/conda/feedstock_root/build_artifacts/pyopenssl_1737243356468/work
pyparsing @ file:///home/conda/feedstock_root/build_artifacts/pyparsing_1743089729650/work
pysftp==0.2.9
PySocks @ file:///home/conda/feedstock_root/build_artifacts/pysocks_1733217236728/work
pytest==8.3.5
python-dateutil @ file:///home/conda/feedstock_root/build_artifacts/python-dateutil_1733215673016/work
python-irodsclient @ file:///home/conda/feedstock_root/build_artifacts/python-irodsclient_1723630829385/work
pytools @ file:///home/conda/feedstock_root/build_artifacts/pytools_1719695845496/work
pytz @ file:///home/conda/feedstock_root/build_artifacts/pytz_1742920838005/work
pyu2f @ file:///home/conda/feedstock_root/build_artifacts/pyu2f_1733738580568/work
PyYAML @ file:///home/conda/feedstock_root/build_artifacts/pyyaml_1648757097602/work
ratelimiter @ file:///home/conda/feedstock_root/build_artifacts/ratelimiter_1667813479108/work
referencing @ file:///home/conda/feedstock_root/build_artifacts/bld/rattler-build_referencing_1737836872/work
requests @ file:///home/conda/feedstock_root/build_artifacts/requests_1733217035951/work
responses @ file:///home/conda/feedstock_root/build_artifacts/responses_1741755837680/work
rfc3339_validator @ file:///home/conda/feedstock_root/build_artifacts/rfc3339-validator_1733599910982/work
rpds-py @ file:///croot/rpds-py_1736541261634/work
rsa @ file:///home/conda/feedstock_root/build_artifacts/rsa_1733662684165/work
s3transfer @ file:///home/conda/feedstock_root/build_artifacts/s3transfer_1741171990164/work
six @ file:///home/conda/feedstock_root/build_artifacts/six_1733380938961/work
smmap @ file:///home/conda/feedstock_root/build_artifacts/smmap_1739781697784/work
-e git+https://github.com/snakemake/snakemake.git@0607695047290effb44367cd004523e5e3398171#egg=snakemake
stone @ file:///home/conda/feedstock_root/build_artifacts/stone_1711655937779/work
tomli==2.2.1
toposort @ file:///home/conda/feedstock_root/build_artifacts/toposort_1734343718011/work
traitlets @ file:///home/conda/feedstock_root/build_artifacts/traitlets_1733367359838/work
types-PyYAML @ file:///home/conda/feedstock_root/build_artifacts/types-pyyaml_1735564787326/work
typing_extensions @ file:///home/conda/feedstock_root/build_artifacts/bld/rattler-build_typing_extensions_1743201626/work
urllib3 @ file:///home/conda/feedstock_root/build_artifacts/urllib3_1718728347128/work
wcwidth @ file:///home/conda/feedstock_root/build_artifacts/wcwidth_1733231326287/work
Werkzeug @ file:///home/conda/feedstock_root/build_artifacts/werkzeug_1733160440960/work
wrapt @ file:///home/conda/feedstock_root/build_artifacts/wrapt_1651495236231/work
xmltodict @ file:///home/conda/feedstock_root/build_artifacts/xmltodict_1732988210345/work
yarl @ file:///home/conda/feedstock_root/build_artifacts/yarl_1648966524636/work
zipp @ file:///home/conda/feedstock_root/build_artifacts/zipp_1732827521216/work

name: snakemake
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
  - aiohttp=3.7.4.post0=py39h3811e60_1
  - appdirs=1.4.4=pyhd8ed1ab_1
  - async-timeout=3.0.1=py_1000
  - atk-1.0=2.36.0=h3371d22_4
  - attrs=25.3.0=pyh71513ae_0
  - aws-xray-sdk=2.14.0=pyhd8ed1ab_1
  - azure-common=1.1.28=pyhd8ed1ab_1
  - azure-storage=0.36.0=py39hf3d152e_1004
  - azure-storage-common=2.1.0=py39hf3d152e_8
  - bcrypt=3.2.2=py39hb9d737c_0
  - blinker=1.9.0=pyhff2d567_0
  - boto3=1.37.23=pyhd8ed1ab_0
  - botocore=1.37.23=pyge38_1234567_0
  - brotli-python=1.0.9=py39h5a03fae_7
  - bzip2=1.0.8=h7f98852_4
  - c-ares=1.19.1=h5eee18b_0
  - ca-certificates=2025.2.25=h06a4308_0
  - cachetools=5.5.2=pyhd8ed1ab_0
  - cairo=1.16.0=h6cf1ce9_1008
  - certifi=2025.1.31=pyhd8ed1ab_0
  - cffi=1.15.0=py39h4bc2ebd_0
  - chardet=4.0.0=py39hf3d152e_3
  - charset-normalizer=3.4.1=pyhd8ed1ab_0
  - click=8.1.8=pyh707e725_0
  - configargparse=1.7=pyhd8ed1ab_1
  - cryptography=44.0.1=py39h7825ff9_0
  - datrie=0.8.2=py39h3811e60_3
  - defusedxml=0.7.1=pyhd8ed1ab_0
  - docutils=0.21.2=pyhd8ed1ab_1
  - dropbox=12.0.2=pyhd8ed1ab_1
  - expat=2.4.8=h27087fc_0
  - fftw=3.3.10=nompi_h77c792f_102
  - flask=3.1.0=pyhd8ed1ab_1
  - flask-cors=5.0.1=pyh29332c3_0
  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0
  - font-ttf-inconsolata=3.000=h77eed37_0
  - font-ttf-source-code-pro=2.038=h77eed37_0
  - font-ttf-ubuntu=0.83=h77eed37_3
  - fontconfig=2.14.0=h8e229c2_0
  - fonts-conda-ecosystem=1=0
  - fonts-conda-forge=1=0
  - freetype=2.10.4=h0708190_1
  - fribidi=1.0.10=h36c2ea0_0
  - ftputil=5.1.0=pyhd8ed1ab_0
  - gdk-pixbuf=2.42.6=h04a7f16_0
  - gettext=0.19.8.1=h73d1719_1008
  - ghostscript=9.54.0=h27087fc_2
  - giflib=5.2.1=h36c2ea0_2
  - gitdb=4.0.12=pyhd8ed1ab_0
  - gitpython=3.1.44=pyhff2d567_0
  - google-api-core=2.24.2=pyhd8ed1ab_0
  - google-auth=2.38.0=pyhd8ed1ab_0
  - google-cloud-core=2.4.3=pyhd8ed1ab_0
  - google-cloud-storage=3.1.0=pyhd8ed1ab_0
  - google-crc32c=1.1.2=py39h8db88ab_3
  - google-resumable-media=2.7.2=pyhd8ed1ab_2
  - googleapis-common-protos=1.69.2=pyhd8ed1ab_0
  - graphite2=1.3.13=h58526e2_1001
  - graphviz=2.49.0=h85b4f2f_0
  - grpcio=1.71.0=py39h6a678d5_0
  - gtk2=2.24.33=h539f30e_1
  - gts=0.7.6=h64030ff_2
  - harfbuzz=3.0.0=h83ec7ef_1
  - httpretty=1.1.4=pyhd8ed1ab_1
  - icu=68.2=h9c3ff4c_0
  - idna=3.10=pyhd8ed1ab_1
  - imagemagick=7.1.0_8=pl5321hb118871_0
  - importlib-metadata=8.6.1=pyha770c72_0
  - importlib_resources=6.5.2=pyhd8ed1ab_0
  - itsdangerous=2.2.0=pyhd8ed1ab_1
  - jbig=2.1=h7f98852_2003
  - jinja2=3.1.6=pyhd8ed1ab_0
  - jmespath=1.0.1=pyhd8ed1ab_1
  - joserfc=1.0.4=pyhd8ed1ab_0
  - jpeg=9e=h166bdaf_1
  - jsondiff=2.2.1=pyhd8ed1ab_1
  - jsonschema=4.23.0=pyhd8ed1ab_1
  - jsonschema-path=0.3.4=pyh29332c3_0
  - jsonschema-specifications=2024.10.1=pyhd8ed1ab_1
  - jupyter_core=5.7.2=pyh31011fe_1
  - lazy-object-proxy=1.7.1=py39hb9d737c_1
  - ld_impl_linux-64=2.40=h12ee557_0
  - lerc=2.2.1=h9c3ff4c_0
  - libabseil=20250127.0=cxx17_h6a678d5_0
  - libblas=3.9.0=16_linux64_openblas
  - libcblas=3.9.0=16_linux64_openblas
  - libcrc32c=1.1.2=h9c3ff4c_0
  - libdeflate=1.7=h7f98852_5
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgd=2.3.3=h6ad9fb6_0
  - libgfortran-ng=13.2.0=h69a702a_0
  - libgfortran5=13.2.0=ha4646dd_0
  - libglib=2.68.4=h174f98d_1
  - libgomp=11.2.0=h1234567_1
  - libgrpc=1.71.0=h2d74bed_0
  - libiconv=1.17=h166bdaf_0
  - liblapack=3.9.0=16_linux64_openblas
  - libnsl=2.0.0=h7f98852_0
  - libopenblas=0.3.21=h043d6bf_0
  - libpng=1.6.37=h21135ba_2
  - libprotobuf=5.29.3=hc99497a_0
  - libre2-11=2024.07.02=h6a678d5_0
  - librsvg=2.52.2=hc3c00ef_0
  - libsodium=1.0.18=h36c2ea0_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - libtiff=4.3.0=hf544144_1
  - libtool=2.4.6=h9c3ff4c_1008
  - libuuid=2.32.1=h7f98852_1000
  - libwebp=1.2.2=h3452ae3_0
  - libwebp-base=1.2.2=h7f98852_1
  - libxcb=1.13=h7f98852_1004
  - libxml2=2.9.12=h72842e0_0
  - lz4-c=1.9.3=h9c3ff4c_1
  - markupsafe=2.1.1=py39hb9d737c_1
  - moto=5.1.2=pyhd8ed1ab_0
  - multidict=6.0.2=py39hb9d737c_1
  - nbformat=5.10.4=pyhd8ed1ab_1
  - ncurses=6.4=h6a678d5_0
  - networkx=3.2.1=pyhd8ed1ab_0
  - nomkl=1.0=h5ca1d4c_0
  - numpy=1.22.3=py39hc58783e_2
  - openapi-schema-validator=0.6.3=pyhd8ed1ab_0
  - openapi-spec-validator=0.7.1=pyhd8ed1ab_1
  - openjpeg=2.4.0=hb52868f_1
  - openssl=3.0.16=h5eee18b_0
  - pandas=1.4.2=py39h1832856_1
  - pango=1.48.10=h54213e6_2
  - paramiko=3.5.1=pyhd8ed1ab_0
  - pathable=0.4.4=pyhd8ed1ab_0
  - pcre=8.45=h9c3ff4c_0
  - perl=5.32.1=2_h7f98852_perl5
  - pip=25.0=py39h06a4308_0
  - pixman=0.40.0=h36c2ea0_0
  - pkg-config=0.29.2=h36c2ea0_1008
  - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_2
  - platformdirs=4.3.7=pyh29332c3_0
  - ply=3.11=pyhd8ed1ab_3
  - prettytable=3.16.0=pyhd8ed1ab_0
  - proto-plus=1.26.1=pyhd8ed1ab_0
  - protobuf=5.29.3=py39he621ea3_0
  - psutil=5.9.1=py39hb9d737c_0
  - pthread-stubs=0.4=h36c2ea0_1001
  - pyasn1=0.6.1=pyhd8ed1ab_2
  - pyasn1-modules=0.4.1=pyhd8ed1ab_1
  - pycparser=2.22=pyh29332c3_1
  - pygments=2.19.1=pyhd8ed1ab_0
  - pygraphviz=1.9=py39ha206bd0_0
  - pynacl=1.5.0=py39hb9d737c_1
  - pyopenssl=25.0.0=pyhd8ed1ab_0
  - pyparsing=3.2.3=pyhd8ed1ab_1
  - pysftp=0.2.9=py_1
  - pysocks=1.7.1=pyha55dd90_7
  - python=3.9.21=he870216_1
  - python-dateutil=2.9.0.post0=pyhff2d567_1
  - python-fastjsonschema=2.21.1=pyhd8ed1ab_0
  - python-irodsclient=2.1.0=pyhd8ed1ab_0
  - python_abi=3.9=2_cp39
  - pytools=2024.1.6=pyhd8ed1ab_0
  - pytz=2025.2=pyhd8ed1ab_0
  - pyu2f=0.1.5=pyhd8ed1ab_1
  - pyyaml=6.0=py39hb9d737c_4
  - ratelimiter=1.2.0=pyhd8ed1ab_1003
  - re2=2024.07.02=hdb19cb5_0
  - readline=8.2=h5eee18b_0
  - referencing=0.36.2=pyh29332c3_0
  - requests=2.32.3=pyhd8ed1ab_1
  - responses=0.25.7=pyhd8ed1ab_0
  - rfc3339-validator=0.1.4=pyhd8ed1ab_1
  - rpds-py=0.22.3=py39h4aa5aa6_0
  - rsa=4.9=pyhd8ed1ab_1
  - s3transfer=0.11.4=pyhd8ed1ab_0
  - setuptools=75.8.0=py39h06a4308_0
  - six=1.17.0=pyhd8ed1ab_0
  - smmap=5.0.2=pyhd8ed1ab_0
  - sqlite=3.45.3=h5eee18b_0
  - stone=3.3.2=pyhd8ed1ab_0
  - tk=8.6.14=h39e8969_0
  - toposort=1.10=pyhd8ed1ab_1
  - traitlets=5.14.3=pyhd8ed1ab_1
  - types-pyyaml=6.0.12.20241230=pyhd8ed1ab_0
  - typing-extensions=4.13.0=h9fa5a19_1
  - typing_extensions=4.13.0=pyh29332c3_1
  - tzdata=2025a=h04d1e81_0
  - urllib3=1.26.19=pyhd8ed1ab_0
  - wcwidth=0.2.13=pyhd8ed1ab_1
  - werkzeug=3.1.3=pyhd8ed1ab_1
  - wheel=0.45.1=py39h06a4308_0
  - wrapt=1.14.1=py39hb9d737c_0
  - xmltodict=0.14.2=pyhd8ed1ab_1
  - xorg-kbproto=1.0.7=h7f98852_1002
  - xorg-libice=1.0.10=h7f98852_0
  - xorg-libsm=1.2.3=hd9c2040_1000
  - xorg-libx11=1.7.2=h7f98852_0
  - xorg-libxau=1.0.9=h7f98852_0
  - xorg-libxdmcp=1.1.3=h7f98852_0
  - xorg-libxext=1.3.4=h7f98852_1
  - xorg-libxpm=3.5.13=h7f98852_0
  - xorg-libxrender=0.9.10=h7f98852_1003
  - xorg-libxt=1.2.1=h7f98852_2
  - xorg-renderproto=0.11.1=h7f98852_1002
  - xorg-xextproto=7.3.0=h7f98852_1002
  - xorg-xproto=7.0.31=h7f98852_1007
  - xz=5.6.4=h5eee18b_1
  - yaml=0.2.5=h7f98852_2
  - yarl=1.7.2=py39hb9d737c_2
  - zipp=3.21.0=pyhd8ed1ab_1
  - zlib=1.2.13=h5eee18b_1
  - zstd=1.5.0=ha95c52a_0
  - pip:
      - exceptiongroup==1.2.2
      - iniconfig==2.1.0
      - packaging==24.2
      - pluggy==1.5.0
      - pytest==8.3.5
      - tomli==2.2.1
prefix: /opt/conda/envs/snakemake

tests/test_expand.py::test_allow_missing
tests/test_expand.py::test_simple_expand
docs/project_info/faq.rst snakemake/io.py
docs/project_info/faq.rst snakemake/io.py