计算在Python中传递给函数的预期参数 问题

计算在Python中传递给函数的预期参数 问题,python,python-3.x,python-3.8,Python,Python 3.x,Python 3.8,我“需要”计算预期传递给函数对象的参数数。我的命令是通过它们的对象存储的,因此我可以单独引用每个命令。我已经尝试过了,虽然它看起来很完美,但由于某些原因,它无法区分0个参数和1个参数作为输出1。看来我将不得不链接实际的代码,因为它必须是一个错误与我的个人脚本。代码如下: # ============== Impots ============== from shlex import split from inspect import getfullargspec # =============

我“需要”计算预期传递给函数对象的参数数。我的命令是通过它们的对象存储的,因此我可以单独引用每个命令。我已经尝试过了,虽然它看起来很完美,但由于某些原因,它无法区分0个参数和1个参数作为输出1。看来我将不得不链接实际的代码,因为它必须是一个错误与我的个人脚本。代码如下:

# ============== Impots ==============
from shlex import split
from inspect import getfullargspec

# ==============  Main  ==============
class Command:
  def __init__(self, fn, name=None, aliases=None):
    self.name = name or fn.__name__
    self.aliases = aliases or []
    self.fn = fn

  def __call__(self, *args, **kwargs):
    return self.fn(*args, **kwargs)

  @property
  def all_names(self):
    return (self.name, *self.aliases)


# ============= Storage =============
class Commands(dict):
  def __init__(self, not_found: str='{} was not recognized.', argmismatch: str='{} takes {} arguments but {} were given.'):
    self.flag = [not_found, argmismatch]
    super().__init__()

  def _add_command(self, command):
    for cmd_name in command.all_names:
      if cmd_name in self:
        raise ValueError(f'Name or alias assigned to function {command.fn.__name__} is duplicate: {cmd_name}')
      self[cmd_name] = command

  def add_command(self, name=None, aliases=None):
    def inner_fn(fn):
      self._add_command(Command(fn, name, aliases))
      return fn
    return inner_fn

  def execute(self, user_input):
    self.command, *args = self.parse(user_input or 'no_input')
    if self.command.lower() in self:
      # THIS IS WHERE THE ISSUE HAPPENS
      print(f'Passed: {len(args)}')
      print(f'Expected: {len(getfullargspec(self[self.command])[0])}')
      if not (len(args)==len(getfullargspec(self[self.command])[0])):
        return (False, self.flag[1].format(self.command, len(getfullargspec(self[self.command])[0]), len(args)))
      self[self.command](*args)
      return (True, 'Command found!')
    else:
      return (False, self.flag[0].format(self.command))

  @staticmethod
  def parse(string):
    if (string=='no_input'):
      return ['','']
    return split(string)




cmd = Commands()
@cmd.add_command(name='foo')
def foo():
  print('bar')
cmd.execute('foo bar')
不是问题
  • 我已经尝试过查看列表中是否填充了
    Null
    值,但事实并非如此
  • 它跨平台(VSCode、Repl.It、PyDroid)实现了这一点,因此它不是一个奇怪的操作系统问题
  • 我不确定它是否会被
    len()
    奇怪地对待,但我知道一个正常的空列表,如
    []
    会被计算为一个

我用它来显示错误信息,也可能是自动提示这个命令可能有什么问题,我希望得到任何帮助,并将用新信息和可能的、正确的、不正确的解决方案更新我的帖子


类似职位
问题类似,但提供的解决方案与我的要求不匹配。

如果只访问第0个元素,则不需要
getfullargspec

my\u function.\uuuu code\uu.co\u argcount