google / python-fire

Python Fire is a library for automatically generating command line interfaces (CLIs) from absolutely any Python object.
Other
26.86k stars 1.44k forks source link

Strings args do not need to be parsed. #459

Open hxse opened 1 year ago

hxse commented 1 year ago
def test(a, b):
    print(a, b)

if __name__ == "__main__":
    fire.Fire(test)

python .\test.py 1 '2 3' 1 2 3

python .\test2.py 1 '""2 3""' 1 2 3

python .\test.py 1 '--2 3' ERROR: The function received no value for the required argument: b

python .\test.py 1 '\"2 3\"'

1 "2
ERROR: Could not consume arg: 3"

python .\test.py 1 '\"\"2 3\"\"' 1 ""2 3""

The correct behavior should be equivalent to print(1, "2 3"), so strings args do not need to be parsed.

DavidFarago commented 1 year ago

I guess not parsing string args will also fix the following problem, right?

I have with the following code:

def preprocess(data_path: str = "data.json", output_format: str):
...

if __name__ == "__main__":
    fire.Fire(preprocess)

If I call python preprocess.py --data_path foo.json --output_format "{response}", I get the error AttributeError: 'set' object has no attribute 'format' because type(output_format) = set and not str.

Dragon-Git commented 11 months ago

I also encountered a similar issue when passing a string starting with "-" , but it can be passed by explicitly specifying the parameter name, for example:

import fire

def test(a, b):
    print(a, b)
    print(type(a), type(b))

if __name__ == "__main__":
    fire.Fire(test)
python ./test.py -a=1 -b='--2 3'
1 --2 3
<class 'int'> <class 'str'>
pioneerHitesh commented 10 months ago

I would like to pick this one up can it be assigned to me?