在 Python 中计算要传递给函数的预期参数
Count expected arguments to be passed to a function in Python
问题
I 'need' 计算预期传递给函数对象的参数数量。我的命令通过它们的对象存储,所以我可以单独引用每一个。我已经尝试了 inspect,虽然它看起来很完美,但出于某种原因它无法区分 0 个参数和 1 个参数作为输出 1。看来我将不得不 link 实际代码,因为它必须是我的个人脚本出错。这是代码:
# ============== 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
值,但没有。
- 它在 across 平台(VSCode、Repl.it、PyDroid)上执行此操作,因此这不是一个奇怪的 os 问题。
- 我不确定它是否会被
len()
奇怪地对待,但我知道像 []
这样的正常空列表被算作一个。
我将其用于错误消息,possibly 用于自动提示命令可能出现的错误,我希望得到任何帮助,并将更新我的 post 与新信息和 pos合理、正确和不正确的解决方案。
类似Posts
问题类似,但提供的解决方案与我的要求不符。
如果您只访问第零个元素,则不需要 getfullargspec
。
my_funct.__code__.co_argcount
问题
I 'need' 计算预期传递给函数对象的参数数量。我的命令通过它们的对象存储,所以我可以单独引用每一个。我已经尝试了 inspect,虽然它看起来很完美,但出于某种原因它无法区分 0 个参数和 1 个参数作为输出 1。看来我将不得不 link 实际代码,因为它必须是我的个人脚本出错。这是代码:
# ============== 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
值,但没有。 - 它在 across 平台(VSCode、Repl.it、PyDroid)上执行此操作,因此这不是一个奇怪的 os 问题。
- 我不确定它是否会被
len()
奇怪地对待,但我知道像[]
这样的正常空列表被算作一个。
我将其用于错误消息,possibly 用于自动提示命令可能出现的错误,我希望得到任何帮助,并将更新我的 post 与新信息和 pos合理、正确和不正确的解决方案。
类似Posts
如果您只访问第零个元素,则不需要 getfullargspec
。
my_funct.__code__.co_argcount