Codacy плохой Первый аргумент супер
При просмотре некоторого кода через codacy, Codacy выявила проблему для следующего фрагмента кода:
def MyClass(OldClass):
def __init__(self, arg1, arg2, *args, **kwargs)
self.arg1 = arg1
self.arg2 = arg2
super(OldClass, self).__init__(*args, **kwargs)
Со следующим объяснением:
Почему это проблема?
Например, неправильный вызов super() с базовым классом в качестве первого аргумента:
class AnotherOldStyleClass(OldStyleClass): def __init__(self): super(OldStyleClass, self).__init__() The super invocation
должно быть:
super(AnotherOldStyleClass, self).__init__()
Кажется, хочет, чтобы я сделал это:
def MyClass(OldClass):
def __init__(self, arg1, arg2, *args, **kwargs)
self.arg1 = arg1
self.arg2 = arg2
super(OldClass, self).__init__(*args, **kwargs)
Или возможно это:
def MyClass(OldClass):
def __init__(self, arg1, arg2, *args, **kwargs)
super(MyClass, self).__init__(*args, **kwargs)
self.arg1 = arg1
self.arg2 = arg2
Может кто-нибудь сказать мне, что из этого является правильным и почему это предпочтительное поведение?
Для справки, вот пример, который я нашел, используя вариант 2.
Изменить: вот мой код, как он выглядит точно. Что объясняет мою ошибку:
class TransferToBigQuery(GoogleCloudStorageToBigQueryOperator):
"""Class to transfer data from Google cloud storage to Big Query"""
def __init__(
self, id, bucket, destination_project_dataset_table, source_objects=None,
schema_fields=None, schema_object=None, source_format='CSV',
create_disposition='CREATE_IF_NEEDED',
skip_leading_rows=0, write_disposition='WRITE_EMPTY',
field_delimiter=',', max_id_key=None, file_xcom=None,
bigquery_conn_id='bigquery_default',
google_cloud_storage_conn_id='google_cloud_storage_default',
delegate_to=None, schema_update_options=(), *args, **kwargs):
super(GoogleCloudStorageToBigQueryOperator, self).__init__(*args,
**kwargs)
Почему это рекомендуется?
0 ответов
Надеюсь, следующий пример объяснит разницу
class Grandparent(object):
def hello(self):
print "hi, I am Grandparent"
class Parent(Grandparent):
def hello(self):
print "hi, I am Parent"
class Child(Parent):
def test(self):
super(Parent, self).hello() # print "hi, I am Grandparent"
super(Child, self).hello() # print "hi, I am Parent"
def proper_way_to_do_same(self):
Grandparent.hello(self) # print "hi, I am Grandparent"
Parent.hello(self) # print "hi, I am Parent"