Возврат класса NoneType при использовании getattr для вызова функции

#python #function #class #types #getattr

Вопрос:

Я пытаюсь создать программу, которая будет заменять значения размеров в тысячах продуктов и десятках функций для каждого продукта. Для этого я использую re для поиска и замены текстовых блоков в XML-программе.

В приведенном ниже коде я создал класс и некоторые функции, которые будут возвращать то, что будет заменять исходный текст.

Я пытаюсь использовать свою функцию get() для динамического вызова других функций в моем классе, но она возвращает только <class ‘NoneType’>, и мне нужно вернуть <class ‘NoneType’><class ‘str’>.

Если я просто вызову MyClass.function (), он вернет <class ‘str’>. Только когда я пытаюсь вызвать свою функцию через MyClass.get (), она возвращает <class ‘NoneType’>

Любая помощь будет чрезвычайно признательна!

     
class Variable:
    def __init__(self, variable, metric_flag, nominal, upper_tol, lower_tol):
        self.variable = variable
        self.metric_flag = metric_flag
        self.nominal = nominal
        self.upper_tol = upper_tol
        self.lower_tol = lower_tol

    def get(self):
        def func_not_found():
            print(f'No Variable {self.variable} Found!')

        func_name = self.variable
        func = getattr(self, func_name, func_not_found)
        func()

    def wobble_comp(self):
        if self.metric_flag == 1:
            return f"""  <WobbleZ1>67.056</WobbleZ1>
            <WobbleX1>{mm(self.nominal) / 2}</WobbleX1>
            <WobbleZ2>12.7</WobbleZ2>
            <WobbleX2>{mm(self.nominal) / 2}</WobbleX2>"""
        else:
            return f"""  <WobbleZ1>67.056</WobbleZ1>
            <WobbleX1>{self.nominal / 2}</WobbleX1>
            <WobbleZ2>12.7</WobbleZ2>
            <WobbleX2>{self.nominal / 2}</WobbleX2>"""

    def axial_primary_relief_angle(self):
        return f"""  <ReliefAngle90No1Nominal>{self.nominal}</ReliefAngle90No1Nominal>
        <ReliefAngle90No1UpperTol>{self.upper_tol}</ReliefAngle90No1UpperTol>
        <ReliefAngle90No1LowerTol>{self.lower_tol}</ReliefAngle90No1LowerTol>"""

    def axial_primary_relief_land_width(self):
        if self.metric_flag == 1:
            return f"""  <Phase90Nominal>{mm(self.nominal)}</Phase90Nominal>
            <Phase90UpperTol>{mm(self.upper_tol)}</Phase90UpperTol>
            <Phase90LowerTol>{mm(self.lower_tol)}</Phase90LowerTol>"""
        else:
            return f"""  <Phase90Nominal>{self.nominal}</Phase90Nominal>
            <Phase90UpperTol>{self.upper_tol}</Phase90UpperTol>
            <Phase90LowerTol>{self.lower_tol}</Phase90LowerTol>"""

    def axial_secondary_relief_angle(self):
        return f"""  <ReliefAngle90No2Nominal>{self.nominal}</ReliefAngle90No2Nominal>
        <ReliefAngle90No2UpperTol>{self.upper_tol}</ReliefAngle90No2UpperTol>
        <ReliefAngle90No2LowerTol>{self.lower_tol}</ReliefAngle90No2LowerTol>"""

    def core_diameter(self):
        if self.metric_flag == 1:
            return f"""  <CoreScanNominal>{mm(self.nominal)}</CoreScanNominal>
            <CoreScanUpperTol>{mm(self.upper_tol)}</CoreScanUpperTol>
            <CoreScanLowerTol>{mm(self.lower_tol)}</CoreScanLowerTol>"""
        else:
            return f"""  <CoreScanNominal>{self.nominal}</CoreScanNominal>
            <CoreScanUpperTol>{self.upper_tol}</CoreScanUpperTol>
            <CoreScanLowerTol>{self.lower_tol}</CoreScanLowerTol>"""


variable1 = 'core_diameter'
metric_flag1 = 1
nominal1 = .125
high_tol1 = .001
low_tol1 = -.001

v = Variable(variable1, metric_flag1, nominal1, high_tol1, low_tol1)

print(type(v.core_diameter()))

print(type(v.get()))
 

Комментарии:

1.Привет, Кевин. В get конце концов, вы просто звоните func , но ничего не делаете с его возвращаемым значением. Вот почему get неявно возвращается None . Просто скажи return func() вместо этого.

2. @Лагербер Спасибо тебе! это все исправило!