【问题标题】:TypeError: ModelBase object got multiple values for keyword argumentTypeError:ModelBase 对象为关键字参数获取了多个值
【发布时间】:2013-03-09 17:39:06
【问题描述】:

我得到了一个

TypeError: ModelBase 对象有多个关键字参数值 '日期'

当我尝试创建“城市”时在我的测试框架上。


这是我的回溯:

ERROR: test_create_city (app.tests.AppManagementTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "..tests.py", line 158, in test_create_city
    city_obj = City(user = self.user, category = c, date = datetime.datetime.now(), **data)
TypeError: ModelBase object got multiple values for keyword argument 'date'

和我的代码:

def test_create_city(self):
c = Category(name=self.categories[0]['name'])
c.save()
data = {'vehiclesound': '/assets/sounds/vehicle.ogg', 'vehicleshadow': '', 'maxspeed': 160.0, 'suspensionrestlength': 0.5, 'category': 12L, 'leftpub': '8294092164', 'wheelmodelzscale': 0.7, 'camheight': 2.1, 'speedminturn': 50.0, 'suspensiondeltatime': 0.25, 'crashsound': '/assets/sounds/crash.ogg', 'decel': 40.0, 'camtilt': 90.0, 'turnspeedmin': 20.0, 'path': 'just_testing_path', 'frontrightwheel': '', 'limitlinealpha': '01', 'open': 1, 'id': 35L, 'limitheight': 700L, 'modelzscale': 0.7, 'model_complete': 'http://youbeq.org/models/get.php?file=default_app/model.dae', 'rearleftwheel': '', 'user_id': 1L, 'wheelmodelyscale': 0.7, 'allwheels': 'http://sketchup.google.com/3dwarehouse/download?mid=4bc3b6056f5cd97eb5d8f6f0e9fb0ac&rtyp=ks&fn=taxi_4tires&ctyp=other&prevstart=0&ts=1343322996000', 'limitlinecolor': 'FFFFFF', 'limitcolor': '00ffff', 'gravity': 70.0, 'modelxscale': 0.7, 'limitlinewidth': 2L, 'kms': 9007.25, 'axisdistance': 2.5, 'minaccelstep': 5.0, 'wheelsdistance': 1.0, 'limitalpha': '70', 'turnspeedmax': 60.0, 'traildistance': 10.0, 'suspensionstiffness': 0.5, 'vehicletype': 'car', 'description': 'The City that never sleeps', 'wheelsheight': 0.37, 'vehiclesoundtime': 150.0, 'rollclamp': 50.0, 'accel': 5.0, 'backgroundsoundtime': 150.0, 'wheelmodelxscale': 0.7, 'rightpub': '5607834847', 'key': 'just_testing_key', 'accelstep': 25.0, 'date': None, 'world': 'earth', 'mapiconurl': '', 'vehicleagility': 0.0005, 'footer_large': '/assets/img/new_york.png', 'modelheight': 0.0, 'frontleftwheel': '', 'speedmaxturn': 5.0, 'name': 'New York', 'footer': '/taxi/assets/img/taxi_smarturbia_image_new_york.png', 'suspensiondamping': -0.15, 'rearrightwheel': '', 'crashsoundtime': 150.0, 'vehiclefastsoundtime': 150.0, 'maxrevspeed': 15.0, 'mass': 3000.0, 'backgroundsound': '/assets/sounds/background.ogg', 'published': 1, 'modelyscale': 0.7, 'model': 'http://sketchup.google.com/3dwarehouse/download?mid=128bf1862f1eb56db5d8f6f0e9fb0ac&rtyp=ks&fn=taxi_new_york_chassi&ctyp=other&prevstart=12&ts=1343297355000', 'vehiclefastsound': '', 'rollspring': 0.5, 'steerroll': -1.0}
        print self.user
        try :
            city_obj = City.objects.get(key=self.categories[0]['name'])
            print ("city_already_exists")
        except City.DoesNotExist:
            print ("debug")
            city_obj = City(user = self.user, category = c, date = datetime.datetime.now(), **data)
            city_obj.save()

【问题讨论】:

    标签: python django unit-testing


    【解决方案1】:

    在 Python 中,您可以传递一个哈希值并使用 ** 来代替关键字参数。考虑这个例子:

    >>> def fun(x, y):
    ...   pass
    ... 
    >>> hash = {'x': 1, 'y': 2}
    >>> fun(**hash) # OK
    >>> fun(x=3, **hash) # x defined both explicitly and in hash
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: fun() got multiple values for keyword argument 'x'
    

    在您的情况下,City 构造函数使用了两次date:您在data 哈希中有'date': None,并使用date = datetime.datetime.now() 显式传递给City

    要修复此代码,您应该从 data 哈希中删除 date,这样它就不会与显式参数冲突。

    【讨论】:

    • 谢谢,尽管我不得不接受另一个答案,因为它更容易理解并且有代码解决方案。还是谢谢
    【解决方案2】:

    您的 data 字典包含 'date': None,因此正如错误所说,您将日期传递两次,因为您还在关键字参数中显式传递了它。

    你可能想做这样的事情:

    new_data = {'user': self.user, 'category': c, 'date': datetime.datetime.now()}
    data.update(new_data)
    city_obj = City(**data)
    

    (注意这会修改data 字典,如果你不想这样做,那么你应该先复制它。)

    【讨论】:

    • 谢谢,虽然我仍然不确定第一次约会是从哪里来的,因为我是从另一个可以正常工作的代码中复制粘贴的。无论如何它现在可以工作了 ;)
    • 我现在明白了,我发现问题与您所说的无关,而是与“footer_large”中的关键错误有关。这让我的蟒蛇发疯了。我现在可以留下我上面的代码,它可以工作了。但是我仍然会将您的答案标记为正确的答案,因为它适用于这种特定情况
    猜你喜欢
    • 2013-08-04
    • 2016-06-24
    • 2015-05-18
    • 1970-01-01
    • 2016-04-25
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多