Проверьте содержимое * args в классе __init__ - PullRequest
0 голосов
/ 28 мая 2019

Я хочу проверить, является ли в параметре * args строка ti.Если так, то я хочу напечатать "ti".Если это список, длина первого элемента которого равна 1, я хочу напечатать «это список со значениями len 1».Если оба не применяются, я хочу напечатать "full list"

Вот мой код, он ничего не печатает, и я не знаю, почему.Может ли кто-нибудь помочь мне здесь?

class MyClass:
    def __init__(self, *args):
        self.args = args

    def test_meth(self):

        if self.args == 'ti':
            print('ti')
        elif type(self.args) == list:
            if len(self.args[0]) == 1:
                print('it is a list with len 1 values')
            else:
                print('full list')

my_class = MyClass('ti')
my_class.test_meth()

Ответы [ 4 ]

3 голосов
/ 28 мая 2019

args всегда будет кортежем, а не списком, даже если есть только 1 элемент:

Вам не нужно проверять, является ли self.args кортежем / списком:

def test_meth(self):
    if len(self.args) == 1 and 'ti' in self.args:
        print('ti')
    if self.args and len(self.args[0]) == 1:
        print('list with length 1 len values')
    else:
        print('full list')
1 голос
/ 28 мая 2019

*args в def __init__(self, *args): приведет к self.args для сохранения кортежа, поэтому первый оператор if всегда будет False.Если вы хотите, чтобы ваш код работал, вы должны переписать его как:

class MyClass:
    def __init__(self, *args):
        self.args = args

    def test_meth(self):
        if self.args == ('ti',):
            print('ti')
        elif len(self.args) == 1 and len(self.args[0]) == 1:
            print('it is a list with len 1 values')
        else:
            print('full list')

my_class = MyClass('ti')
my_class.test_meth()

или с более универсальным (работает с любым итерируемым args):

class MyClass:
    def __init__(self, *args):
        self.args = args

    def test_meth(self):
        if len(self.args) == 1 and self.args[0] == 'ti':
            print('ti')
        elif len(self.args) == 1 and len(self.args[0]) == 1:
            print('it is a list with len 1 values')
        else:
            print('full list')

my_class = MyClass('ti')
my_class.test_meth()
1 голос
/ 28 мая 2019

type(my_class.args) равно tuple, поэтому вы не можете сравнить его с одним значением, например

if self.args == 'ti':

Однако вы можете сделать

if "ti" in self.args and len(self.args) == 1:

, чтобы проверить, что "ti"является единственным входом.

0 голосов
/ 28 мая 2019

self.args, как упоминает @quamrana, всегда имеет тип tuple и поэтому никогда не равен 'ti' или типу list. Вот почему ваш текущий код ничего не печатает.

Я полагаю, что следующее делает то, что вы описываете:

class MyClass:                                                              
    def __init__(self, *args):                                              
        self.firstarg = args[0]                                             

    def test_meth(self):                                                    
        if self.firstarg == 'ti':                                           
            print('ti')                                                     
        elif type(self.firstarg) == list:                                   
            if len(self.firstarg) == 1:                                     
                print('it is a list with 1 value')                          
            else:                                                           
                print('full list')                                          

my_object = MyClass('ti')                                                   
my_object.test_meth()                                                       
my_object = MyClass(['ti'])                                                 
my_object.test_meth()                                                       
my_object = MyClass(['ti', 'ti'])                                           
my_object.test_meth()

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...