我有一个Python程序,其中两个变量设置为该值'public'.在条件表达式中,我的比较var1 is var2失败了,但是如果我将其更改为var1 == var2它则返回True.
现在,如果我打开我的Python解释器并进行相同的"是"比较,它就会成功.
>>> s1 = 'public'
>>> s2 = 'public'
>>> s2 is s1
True
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
我new_tag从带有self.response.get("new_tag")和selected_tags来自复选框字段的表单文本字段中获取
self.response.get_all("selected_tags")
Run Code Online (Sandbox Code Playgroud)
我把它们组合成这样:
tag_string = new_tag
new_tag_list = f1.striplist(tag_string.split(",") + selected_tags)
Run Code Online (Sandbox Code Playgroud)
(f1.striplist是一个删除列表中字符串内部空格的函数.)
但是在tag_list空的情况下(没有输入新标签)但有一些selected_tags,new_tag_list包含一个空字符串" ".
例如,来自logging.info:
new_tag
selected_tags[u'Hello', u'Cool', u'Glam']
new_tag_list[u'', u'Hello', u'Cool', u'Glam']
Run Code Online (Sandbox Code Playgroud)
如何摆脱空字符串?
如果列表中有空字符串:
>>> s = [u'', u'Hello', u'Cool', u'Glam']
>>> i = s.index("")
>>> del s[i]
>>> s
[u'Hello', u'Cool', u'Glam']
Run Code Online (Sandbox Code Playgroud)
但是如果没有空字符串:
>>> s = [u'Hello', u'Cool', u'Glam']
>>> if s.index(""):
i = s.index("")
del s[i]
else:
print "new_tag_list …Run Code Online (Sandbox Code Playgroud) 使用"is"运算符或"=="运算符来比较Python中的两个数字是否更好?
例子:
>>> a = 1
>>> a is 1
True
>>> a == 1
True
>>> a is 0
False
>>> a == 0
False
Run Code Online (Sandbox Code Playgroud) 我尝试运行这段代码:
path = '/bla/bla/bla'
if path is True:
print "True"
else:
print "False"
Run Code Online (Sandbox Code Playgroud)
它打印错误.我认为Python将任何有价值的东西视为真.为什么会这样?
我做了几个布尔比较:
>>> (True or False) is True
True
>>> (True or False) == True
True
Run Code Online (Sandbox Code Playgroud)
这听起来像==和is是布尔值互换.
有时使用起来更清楚 is
我想知道:
是True和Falsepython中预分配?
是bool(var)始终返回相同True(或False与预分配)True(或False)?
它是安全的替代==与is比较布尔值?
这不是最佳实践.
我只是想知道真相.
我注意到有一个比较运算符is not.我应该把它翻译成
!=
Run Code Online (Sandbox Code Playgroud)
代替
== not
Run Code Online (Sandbox Code Playgroud) 是否优先做:
if x is y:
return True
Run Code Online (Sandbox Code Playgroud)
要么
if x == y
return True
Run Code Online (Sandbox Code Playgroud)
同样的事情是"不是"
我使用django的默认站点地图应用程序实现了一个简单的站点地图类.由于执行时间很长,我添加了手动缓存:
class ShortReviewsSitemap(Sitemap):
changefreq = "hourly"
priority = 0.7
def items(self):
# try to retrieve from cache
result = get_cache(CACHE_SITEMAP_SHORT_REVIEWS, "sitemap_short_reviews")
if result!=None:
return result
result = ShortReview.objects.all().order_by("-created_at")
# store in cache
set_cache(CACHE_SITEMAP_SHORT_REVIEWS, "sitemap_short_reviews", result)
return result
def lastmod(self, obj):
return obj.updated_at
Run Code Online (Sandbox Code Playgroud)
问题是memcache只允许最大1MB的对象.这个比1MB大,所以存入缓存失败:
>7 SERVER_ERROR object too large for cache
Run Code Online (Sandbox Code Playgroud)
问题是django有一种自动的方法来决定何时应该将站点地图文件划分为较小的站点地图文件.根据文档(http://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/):
如果您的某个站点地图的网址超过50,000,则应创建索引文件.在这种情况下,Django将自动对站点地图进行分页,索引将反映出来.
您认为启用缓存站点地图的最佳方式是什么? - 攻击django sitemaps框架以限制单个站点地图大小,比方说,10,000个记录似乎是最好的主意.为什么首先选择了50,000个?谷歌的建议?随机数? - 或许有一种方法可以让memcached存储更大的文件? - 或者也许保存了onces,站点地图应该作为静态文件提供?这意味着不是使用memcached进行缓存,而是必须手动将结果存储在文件系统中,并在下次请求站点地图时从那里检索它们(可能每天在cron作业中清理目录).
所有这些似乎都很低级,我想知道是否存在明显的解决方案......
请考虑以下代码段:
my_string = 'asdf'
print(my_string is 'xfje') #R0123
Run Code Online (Sandbox Code Playgroud)
Pylint R0123在第二行返回推荐,我在错误消息wiki上找不到.不过,在这部分文档中提到了它:
文字比较(R0123):
与文字的比较在将对象与文字进行比较时使用,这通常是您不想做的事情,因为您可以比较不同于预期的文字.
这个解释对我没有任何帮助.我知道is用于两个字符串对象之间的比较可能会导致与预期不同的结果,但是为了将对象与文字进行比较,它与之相同==.使用时==,错误消失.
我为什么不在is这里使用?
说我有2个功能.我希望func2返回func1 UNLESS func1返回None,在这种情况下func2返回其他内容.我有两种方法可以做到这一点,但他们都觉得有点不对劲.
我可以说:
def func1(n):
if (condition):
return foo
def func2(n):
if func1(n) is not None:
return func1(n)
else:
return something_else
Run Code Online (Sandbox Code Playgroud)
但这感觉不对,因为我必须两次调用func1(n)(并且func1(n)是一个更大的计算).为了解决这个问题,我可以说:
def func1(n):
if (condition):
return foo
def func2(n):
foo = func1(n)
if foo is not None:
return foo
else:
return something_else
Run Code Online (Sandbox Code Playgroud)
但这感觉不对,因为我认为我不应该分配一个永远不会再次使用的新变量,只是为了检查func1是否返回None.
有没有更简单的方法来执行此操作,我不必再调用func1两次,而且我不必创建新变量?如果这是唯一的方法,你会推荐哪两个?我目前使用第二种方式(我将foo设置为func1返回的位置,而不是返回foo,除非foo == None)
另外,请记住,在我的实际代码中,我调用了几个不同的函数,我想返回第一个不是None的函数,这只是一个更简单的代码版本,可以解决问题.