Wrap Context Manager (as nested) in a Python function

To make my code more elegant, I need to wrap a context manager with initialization code as a function in Python. This is definitely possible, but it took me some time to find the most elegant way to do this.

Generally speaking, you will want to enter all contexts when using the decorator @contextlib.contextmanager or @contextlib.asynccontextmanager. When the end user uses with my_function() as a:, everything inside the with block has been inside the nested contexts. When Python gets out of the end user's with block, it should also run all related __exit__s in the wrapper function. See example (requires Python 3.7+ probably and writes test.txt; you can test it on repl.it):

import asyncio
import contextlib
import aiofiles
import typing

@contextlib.asynccontextmanager
async def my_context_manager() -> typing.ContextManager[aiofiles.threadpool.AsyncFileIO]:
    # init
    filename = 'test.txt'

    async with aiofiles.open(filename, 'w+') as file:
        # you can still override or interact with `file` if needed
        yield file

async def main():
    # end user
    myfile: aiofiles.threadpool.AsyncFileIO
    async with my_context_manager() as myfile:
        print(await myfile.write("12\n"))
        await myfile.seek(0)
        print(await myfile.readline())

asyncio.run(main())

When I rewrite the code above I feel it so easy and natural. It really took me some time to realize how this works.

热心待人的果断正直 / 随笔谈

有时候也觉得自愧不如,都二十好几了,都已经 2020 了,为什么还在纠结这种最基本的问题。但脑海里闪过的无数个片段,总让我觉得应该写下来。

有天下午在路口边等过马路,一个妹子骑着车在过另一边的马路,突然车上好几样东西掉到了地上。这时离汽车绿灯还有十几秒,妹子回了头看了一眼,只好急着先把车推到路中间的安全岛上。

停车线后排着队的车,还有地上的东西,还有倒计时开始的红灯闪烁,看起来是一个很危急的时刻。

过了几秒钟,站在我前面几米处、离妹子更近、也在等过马路的一个小哥跑到马路中央,默默捡起马路上的那些东西,又跑着递给了快到安全岛的妹子。似乎两人交流了一两句,小哥又跑了回来。绿灯亮起,汽车开过,化险为夷。

当时的我看到这里,有那么一点呆。事后我甚至在想,如果我帮忙去捡东西,毕竟不是我的东西,骑车人会不会怕我把东西拿走不还呢?

但又仔细一想,一个正常的和谐社会为什么要有这种担心呢?

前几周跟室友去馆子吃饭,吃完饭走出门没多久,身后十多米的地方就传来打碎玻璃的声音。

想先说明的一件事情,我们吃饭的这片地方是公认的治安相对没那么好的地方。

我们边走边回头,只见两个似乎是店主的亚裔面孔的人,跟另一个人吵吵嚷嚷地出了一家我们完全不熟悉的店铺,也不知道具体发生了什么事。街上人不多,但似乎附近的人都在看着。然后据我室友说,这另一个人推了其中一位店主一把,女店主摔在地上看着很疼。

又接着,这位推人的老兄骂骂咧咧地跑到路口对面,就不见了踪影。

我在路口站着有点呆。这时候一辆车开过路口,里面有个女声似乎朝着我这个方向骂了一句,然后就飞驰着开走了。

我也不敢看热闹,似乎另一个店主在看护着被摔在地上的女店主,过了一会应该还是有人上去帮了忙的吧。

事后想起来,在这片治安欠佳的地方发生这种事情,作为一个在当地生活的我,没有去关心一下,似乎就连最基本的人情都没有尽到了。我又理性地想了一想,这种情况应不应该报警呢?如果叫了救护车,受伤的人又付不付得起钱呢?他们是不是想“算了就好”呢?似乎这一切的判断都在一个难以决定的分界线上。没有什么社会经验,又不是当地永久居民的我,第一次看到这种事情,似乎能躲开,就少了一事。

但刚才飞车而过的那句骂声似乎在提醒着我,这种想法很危险。但她自己对坐视不管的我骂了一句之后,为什么又坐视不管地飞车开走了呢?

所以为什么我有这么多顾虑呢?

前几天走在街上去吃饭,一个叔叔迎面尝试跟我说话。我本来还想装作听不懂,就一句话都没说,他又来了一句“我又不咬人”——这个比喻我现在仔细想了想,可是完全没法接受。为什么不咬人会成为与别人交流的底线呢?可当时的我想了想,那还是听听吧。

这叔叔说,自己丢了工作,没钱吃饭,而且家里还有四个孩子,说着就拿出手机给我看孩子的照片。我还印象很清楚,是 Android 自带的 Google 照片应用。

我愣了几秒钟,感觉自己的确没有什么拒绝的理由,只好说,我准备去麦当劳吃饭,你要的话可以跟着我去。他接道,不不,麦当劳太贵了,他需要点现金,去 CVS 买点吃的和纸巾。

听到这我心里想,这里离别的更便宜的超市走路十多分钟,你花着别人的钱,何德何能去并不便宜的 CVS 买东西。

接着他说,今天自己已经筹到 20 块了,还需要 20 块。接下来他说的是,只要 20 块,就能给别人的生活带来温暖呢。像极了募捐的用词。

我回道,我身上没带现金。他说,这附近超多 ATM,你去取一下很方便的。像极了电信诈骗帮你出尽主意找钱的套路。

我还是重复着这一句,我身上没带现金。他坚持了一两秒,有点怒地唉了一声,扭头,就走了。

在我这片地方,乞讨的挺多,卖艺的可真没有。我也见过有中年人真的给了“想要钱买点吃的”人帮助之后,乞讨者拿着食物,说法马上变成了想要钱买饮料。

我也不知道,他们是不是没有工作也过得还算凑合。理想社会里,是真的应该帮助路边缺钱的人,还是他们根本就不会存在呢?

这篇的几个片段下来,感觉自己可能真如飞车所骂,看起来是文绉绉有点想法,看直觉反应就知道根本不是人,没有见义勇为的那种果断和正直。都二十好几了,也不知道这会不会因为社会大学的教育而变好,所以,还请看官多包容吧。

麻省理工的信息服务“客服”

最近听说,学校里有位新来的老师,登不上自己的学校邮箱,然后抱怨(翻译的版本俏皮了一些):

行吧,我试着在两个地方登录我的邮箱:(……),在哪边我都看不到登录页面。今日头条——都 9102 年了,电子邮件都已经 20 多年了。你们能不能招一些麻省理工的学生把你们的系统搞好……

不想评价这个老师的态度和“提问的智慧”(他的“建议”似乎也被自动忽略掉了),麻省理工的学生愿不愿意做这个工作也是个问号。不过我们可以类比一下,麻省理工自己的信息服务水平如何呢?他们会招“麻省理工的学生”吗? 继续阅读“麻省理工的信息服务“客服””

Side note of some scheduling tools

SignUpGenius

Free version includes:

  • multiple spots in one time slot
  • email (ics) confirmation to invitee
  • export as table
  • cancellation email triggered by organizer
  • modify bookings by unique link (in the email).

UX feels like oldest.

Doodle

Free version includes:

  • multiple spots in one time slot
  • export as table (maybe?)

No invitee email is available in free version. Booking modification can only be protected if invitees log in with a Doodle account. UX is a lot better.

Calendly

Free version includes:

  • email (ics) confirmation to invitee
  • export as table
  • cancellation email triggered by organizer
  • modify bookings by unique ID (in the email)

Paid version (10 days trial) includes:

  • multiple spots in one time slot
  • webhook (API)

UX is the best.

意想不到的「重设密码」挑战 / 理想园

去年我提了一嘴,现在在做一个客服的工作。不做不知道,电脑常识的下限真的让我永远想不到。

对方的提问常常让我反思,为什么会造成这种情况。作为一个技术员,换个角度看看普通人的操作,其实对更友好的工程设计还是挺有帮助的。

这一篇,来看个似乎简单、但不少人会有奇奇怪怪的问题的业务:「重设密码」。以下提到的虚构问题,基本上都有真实案例支撑,毕竟生活比故事更精彩。 继续阅读“意想不到的「重设密码」挑战 / 理想园”

Strip Assets Files in new Android Gradle

Spending 2 hours on this because 1) I don't have experience with Gradle script (its syntax looks funky) 2) DJI sxxks, and they put 50MB of large assets files to their SDK, which is camera distrotion_correction files that I never need, and 3) Android Gradle library upgrades, which deprecating mergeAssets.

Looking at some GitHub projects's Gradle script, it looks like dependsOn is very popular in defining what order the task should be executed, and it works! 继续阅读“Strip Assets Files in new Android Gradle”

猪年前夕的一点回望

预告:本文纯属个人的思绪宣泄。

时间真快呀,这可能对于所谓年轻人来说是一种新奇的感觉吧。都已经 2019 了,来一点什么十年挑战,然后就会想着怀旧,于是就发现自己已经再也不是那个「宝宝」了,自己却依然是一无所有。

这也是为什么这一年我写的东西越来越少的原因吧。除了抱歉之余,也请不要带着什么改变的期望。手头堆的事情太多了,写东西的(一些可能莫须有的)顾忌也越来越多了。

回想起来,2018 的上半年可能是我这些年来最充实的半年了,四处奔波,赚几份钱,认识了不少人,简历也莫名其妙地多了好多能写的东西。然而一切就在我夏天第二次从北京回家之后就结束了。可能是因为平衡,马上人就颓了下来。

继续阅读“猪年前夕的一点回望”

信息中心客服的 4 小时

中午 12 点,吃完午饭的我走进了学校信息中心的客服中心。正午的阳光透过落地窗从街头照进房间,显得有些慵懒。我找了个位置坐下,脱下外套,工服、工牌就位。

今天是我在客服中心上班的第三天,按计划还在培训的阶段。我跟第一次见的主管(老师)郭姐姐打了招呼,她就告诉我“今天有点难办,我去问问要怎么弄”。过了会她把她的主管带到了房间,说了下情况:下午这边只有我跟另外一位学生李斯,李斯老哥也没来几周,而我还在第一周培训。大主管问了问我培训的进度,接着问我:“你今天自己接电话感觉行吗?”我有点懵,就说“我试试吧”,两位主管接着就跟我说“有啥问题你让对方稍等,放下电话问我们谁都行,不用慌,大家都是提问题过来的”。

于是,我在我的工位坐下,登陆电话系统,打开工单界面,试了试耳机。两位主管还在谈笑风生的时候,我的第一个电话就毫无防备地打进来了。

继续阅读“信息中心客服的 4 小时”

对一列微信小程序比赛作品的想法

一堆事情没做,又厚着脸皮来写好久没有写过的博客了。今年真是神奇,参加了个小程序比赛,莫名其妙地进了地区选拔赛,虽然成绩并不理想(自费旅游),但也算是领略学习优秀大学生风采了。趁着比赛完想不到要干啥,北京的天也没黑,就斗胆来评论一下前十好了。

我来参加这个比赛的时候,想法是觉得,既然是小程序比赛,选题总该是适合小程序的,才能代表小程序的先进方向。一些 PWA 甚至网页就已经足够实现功能、又没结合微信小程序特点的作品,我总觉得蛮尴尬的。可能并不是每个人都会这么去执着平台依赖这个国内不大关注的问题的吧。答辩的时候并没想到要提小程序与 PWA 区别的思考,结果还剩了几分钟时间,后来发现一整天没人提 PWA 相关,想想还是挺遗憾。

先进一下前情提要。这轮选拔赛的前十都是有奖金的,其中前二可以晋级进入全国决赛。这个名次是现场公布的,不知道最后会不会公示。下面就按名次说好了,我也是这几天才第一次接触到这些小程序;如果没有特别说明,可以直接在微信里搜到这些小程序。 继续阅读“对一列微信小程序比赛作品的想法”