开发者社区> 问答> 正文

计算要传递给Python中函数的预期参数

问题

我“需要”计算期望传递给函数对象的参数数量。我的命令是通过它们的对象存储的,因此我可以分别引用每个命令。我已经尝试过检查,尽管它看起来很完美,但是由于某种原因,它不能区分两个输出均为0的自变量和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, \*rgs, \*kwargs):
    return self.fn(\*rgs, \*kwargs)

  @property
  def all_names(self):
    return (self.name, \*elf.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, \*rgs = 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](\*rgs)
      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')

不是问题 * I have already tried seeing if the list was filled with a ` Null ` value, it is not. * It does this across platforms (VSCode, Repl.it, PyDroid) so it is not a weird os issue. * I'm not sure if it could be ` len() ` treating it weirdly, but I know a normal empty list such as ` [] ` is counted as one. *我将其用于错误消息,并可能用于自动提示命令可能出了什么问题,我将乐意提供任何帮助,并会使用新信息以及可能的,正确的和不正确的解决方案来更新我的帖子。 * 类似帖子

这个帖子有类似的问题,但是提供的解决方案与我的要求不符。

问题来源:stackoverflow

展开
收起
is大龙 2020-03-25 00:22:37 502 0
1 条回答
写回答
取消 提交回答
  • 如果只访问第零个元素,则不需要getfullargspec

    my_funct。代码 .co_argcount

    回答来源:stackoverflow

    2020-03-25 00:22:46
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载