首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >get_owner_by_number_input_value1()为参数'self‘获取了多个值

get_owner_by_number_input_value1()为参数'self‘获取了多个值
EN

Stack Overflow用户
提问于 2021-12-01 15:40:48
回答 1查看 44关注 0票数 1

在我将这段代码转移到这个类之前,get_owner_by_number_input_value1运行得很好,但是在这个类中,它现在不工作了,并且给出了一个错误:"get_owner_number_input_value1 () Got Value for Argument 'Self'“,现在只有带有get_owner_by_number_input_value2的选项。我不明白这是什么错误,我看起来像是相似的问题,却没有找到与我相似的地方。头疼,花了一大堆时间,但没有任何意义。很大的帮助请求,因为我不知道该做什么,也不知道还能去哪里联系)

代码语言:javascript
复制
import inspect


documents = [
    {"type": "passport", "number": "2207 876234", "name": "Gloria", },
    {"type": "invoice", "number": "11-2", "name": "Jack Nickolas", },
    {"type": "insurance", "number": "10006", "name": "John", }
]

class DocumentManager:
    def __init__(self, doc):
        self._documents = doc

    def input_arguments_with_prompts(*prompts):
        def decorator(func):
            def wrapper(*args, **kwargs):
                parameters = inspect.signature(func).parameters
                for prompt, (name, parameter) in zip(prompts, parameters.items()):
                    while True:
                        value = input(prompt)
                        if parameter.annotation is inspect._empty:
                            converted_value = value
                            break
                        try:
                            converted_value = parameter.annotation(value)
                        except ValueError:
                            pass
                        else:
                            break
                    kwargs[name] = converted_value
                return func(*args, **kwargs)
            return wrapper
        return decorator

    def get_owner_by_number(self, number: str) -> str:
        for document in self._documents:
            if document["number"] == number:
                return document["name"]
        return ""

    @input_arguments_with_prompts(
        "Enter the document number, the owner of which you want to get: ",
    )
    def get_owner_by_number_input_value1(self, input_number: str):
        return self.get_owner_by_number(input_number)

    def get_owner_by_number_input_value2(self):
        input_number = input('Enter number')
        return self.get_owner_by_number(input_number)

dm = DocumentManager(documents)
dm.get_owner_by_number_input_value1()
EN

回答 1

Stack Overflow用户

发布于 2021-12-02 06:21:15

这并不完美,因为显然是you can't detect whether a function is in a class,但您可以使用启发式来检查这种情况,并希望此装饰器的用户遵循将类中方法的第一个参数命名为"self"的约定。

代码语言:javascript
复制
import inspect


documents = [
    {"type": "passport", "number": "2207 876234", "name": "Gloria", },
    {"type": "invoice", "number": "11-2", "name": "Jack Nickolas", },
    {"type": "insurance", "number": "10006", "name": "John", }
]

def input_arguments_with_prompts(*prompts):
    def decorator(func):
        def wrapper(*args, **kwargs):
            parameter_list = list(inspect.signature(func).parameters.items())
            if parameter_list[0][0] == "self":
                parameter_list = parameter_list[1:]
            for prompt, (name, parameter) in zip(prompts, parameter_list):
                while True:
                    value = input(prompt)
                    if parameter.annotation is inspect._empty:
                        converted_value = value
                        break
                    try:
                        converted_value = parameter.annotation(value)
                    except ValueError:
                        pass
                    else:
                        break
                kwargs[name] = converted_value
            return func(*args, **kwargs)
        return wrapper
    return decorator

class DocumentManager:
    def __init__(self, doc):
        self._documents = doc

    def get_owner_by_number(self, number: str) -> str:
        for document in self._documents:
            if document["number"] == number:
                return document["name"]
        return ""

    @input_arguments_with_prompts(
        "Enter the document number, the owner of which you want to get: ",
    )
    def get_owner_by_number_input_value1(self, input_number: str):
        return self.get_owner_by_number(input_number)

    def get_owner_by_number_input_value2(self):
        input_number = input('Enter number')
        return self.get_owner_by_number(input_number)

dm = DocumentManager(documents)
print(dm.get_owner_by_number_input_value1())

如果你也想支持类方法,你可以把检查改成if parameter_list[0][0] in {"self", "cls"}。我链接的答案中还有一个启发式方法,用于检查方法的限定名中是否有.,因此如果您愿意,也可以添加它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70187114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档