Python __add__带有整数的魔术方法

时间:2019-11-18 10:43:51

标签: python syntax int add magic-methods

当我练习时:

import mongoengine
from mongoengine import connect,queryset
import argparse
from mongoengine.queryset.visitor import Q
import pandas as pd 

from mongoengine import *
import pymongo
from datetime import datetime 
import datetime
import json 
from bson.son import SON

if connect('AggregationsDataBase', host='mongodb://127.0.0.1', port=27017):
    print('Connection Established')

class Extraction(mongoengine.Document):
    meta = {'collection': 'MetaDataStore'}
    # date = mongoengine.ComplexDateTimeField()#else non humanreadable  
    date = mongoengine.DateTimeField()#else non readable  
    site = mongoengine.StringField()
    language = mongoengine.StringField()
    site_type = mongoengine.StringField()
    occurence = mongoengine.DecimalField()
    categories = mongoengine.ListField()
    type = mongoengine.StringField()
    @queryset_manager
    def objects(Extraction, queryset):
        return queryset.order_by('-date')


# #dummy Visualization (WORKS OK )
for search in Extraction.objects():
        print ("site: {} Date: {} occurence : {} language: {} site_type: {} categories: {}"\
        .format(search.site,search.date,search.occurence,search.language,search.site_type,search.categories))

#data_sample: how date is shaped (all good so far )
sample = Extraction.objects.first()
sample=sample.to_json()
print(sample)

# # Simple aggregations via MongoEngine (WORKS OK ): 
search=Extraction.objects()
print(search.count())
print(search.average('occurence'))
print(search.filter(site_type="news").count())



#advanced Aggregations Queries: (RETURNS EMPTY LIST [])
kwargs = {}
start = datetime.datetime(2014, 12, 11)
end = datetime.datetime(2019, 3, 13)
kwargs['date'] = { '$lt': end, '$gt': start }
T = Extraction.objects(**kwargs)
x = T.filter((Q(date__gte=start) & Q(date__lte=end)))
print(x)

正在工作。但这

>>> "a".__add__("b")
'ab'

不起作用。 这是可行的:

>>> 1.__add__(2)
SyntaxError: invalid syntax

这是怎么回事?它与变量命名规则有关吗?python是否认为我在不使用空间时试图创建变量?

3 个答案:

答案 0 :(得分:2)

python词法分析器尝试将整数后跟一个点解释为浮点数。为了避免这种歧义,您必须添加一个额外的空间。

为了进行比较,相同的代码可以双重使用:

>>> 4.23.__add__(2)
6.23

如果将int放在括号中也可以使用:

>>> (5).__add__(4)
9 

答案 1 :(得分:2)

Python解析器特意保持简洁明了。当它看到1.时,就认为您正处于浮点数的中间,并且1._不是有效数字(或更正确地说,1.是有效的浮点,并且您可以t用_跟随值:"a" __add__("b")也是错误)。因此,任何清楚表明.都不是数字的组成部分的方法都会有所帮助:正如您所发现的那样,在点之前有一个空格(由于在数字中找不到空格,Python放弃了浮点运算的想法与完整的语法)。括号也可以:(1).__add__(2)。添加另一个点也可以:1..__add__(2)(这里的1.是有效数字,然后.__add__做通常的事情)。

答案 2 :(得分:2)

使用1.时,解释器会认为您已开始编写浮点数(您可以在IDE中(至少Pycharm)看到点是蓝色,而不是白色)。空格告诉它将1.视为一个完整的数字1.01..__add__(2)也可以解决问题。