google / python-fire

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

How to use the avialable command "S.xx", such as S.count #502

Closed xiaoxstz closed 4 months ago

xiaoxstz commented 4 months ago

Put the code (copied from official document here) below to file hello.py

import fire

def hello(name):
  return 'Hello {name}!'.format(name=name)

if __name__ == '__main__':
  fire.Fire(hello)

I want to explore the commands provided by fire. I use the command to check help python Hello.py Bob --help

Then, I see the help like below

NAME                                                                       
    fire1.py abc - "abcabc"                                                

SYNOPSIS                                                                   
    fire1.py abc COMMAND                                                   

DESCRIPTION                                                                
    The string "abcabc"                                                    

COMMANDS                                                                   
    COMMAND is one of the following:                                       

     capitalize                                                            
       Return a capitalized version of the string.                         

     casefold                                                              
       Return a version of the string suitable for caseless comparisons.   

     center                                                                
       Return a centered string of length width.                           

     count                                                                 
       S.count(sub[, start[, end]]) -> int                                 

     encode                                                                
       Encode the string using the codec registered for encoding.          

     endswith                                                              
       S.endswith(suffix[, start[, end]]) -> bool                          

     expandtabs                                                            
       Return a copy where all tab characters are expanded using spaces.   

     find                                                                  
       S.find(sub[, start[, end]]) -> int                                  

     format                                                                
       S.format(*args, **kwargs) -> str     

...
...                               

I know the usage of some commands, such as capitalize, casefold,center.

python Hello.py Bob                         # output: Hello Bob!
python Hello.py Bob casefold           # output: hello bob!
python Hello.py Bob capitalize         # output: Hello bob!
# center is harder, but --help will tell you the usage
python Hello.py Bob center --help
python Hello.py Bob center 20 "="  # output: =====Hello Bob!=====

However, the other commands whose help says S.xxx seems not work, for example, count, endswith, find, and format

python Hello.py Bob count              # throw error
python Hello.py Bob count --help   # throw error
xiaoxstz commented 4 months ago

I don't know why count throws the errors

python Hello.py Bob count throw errors below:

Traceback (most recent call last):
  File "D:\Desktop\Hello.py", line 8, in <module>
    fire.Fire(hello)
  File "C:\Users\tanzi\scoop\apps\mambaforge\current\Lib\site-packages\fire\core.py", line 143, in Fire
    component_trace = _Fire(component, args, parsed_flag_args, context, name)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\tanzi\scoop\apps\mambaforge\current\Lib\site-packages\fire\core.py", line 477, in _Fire
    component, remaining_args = _CallAndUpdateTrace(
                                ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\tanzi\scoop\apps\mambaforge\current\Lib\site-packages\fire\core.py", line 693, in _CallAndUpdateTrace
    component = fn(*varargs, **kwargs)
                ^^^^^^^^^^^^^^^^^^^^^^
TypeError: count() takes at least 1 argument (0 given)

According to the message, I tried the command below. It works.

python Hello.py Bob                   # output: Hello Bob!
python Hello.py Bob count "o"  # output: 2
python Hello.py Bob count "h"  # output: 0
python Hello.py Bob count "H"  # output: 1
python Hello.py Bob count "Hello"  # output: 1

The usage is clear now. count is used to find str in the output string.

However, checking its help throws errors: python Hello.py Bob count "Hello" --help

Traceback (most recent call last):
  File "D:\Desktop\Hello.py", line 8, in <module>
    fire.Fire(hello)
  File "C:\Users\tanzi\scoop\apps\mambaforge\current\Lib\site-packages\fire\core.py", line 143, in Fire
    component_trace = _Fire(component, args, parsed_flag_args, context, name)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\tanzi\scoop\apps\mambaforge\current\Lib\site-packages\fire\core.py", line 477, in _Fire
    component, remaining_args = _CallAndUpdateTrace(
                                ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\tanzi\scoop\apps\mambaforge\current\Lib\site-packages\fire\core.py", line 693, in _CallAndUpdateTrace
    component = fn(*varargs, **kwargs)
                ^^^^^^^^^^^^^^^^^^^^^^
TypeError: count() takes no keyword arguments
xiaoxstz commented 4 months ago

The solution is clear now.

python Hello.py Bob count "Hello"  #  Output: 1
python Hello.py Bob endswith "b"  # Output: False
python Hello.py Bob endswith "!"   # Output: True
python Hello.py Bob find "B"           # Output: 6
python Hello.py Bob index "B"         # Output: 6
python Hello.py Bob find "Bob"       # Output: 6
python Hello.py Bob index "Bob"     # Output: 6