小結 python 實戰中遇到的幾種需要化名的情境

笑來在《自學是門手藝》的《2.4.3 化名與匿名》中,講到了函數的化名。經過幾個月的實戰,我發現,實際上化名無處不在。我有時也會稱之爲“別稱”,意思一樣。函數化名只是化名的一種應用場景,還有好幾種使用化名的地方,本篇筆記將整理小結我所遇到的各種化名。

情境A:導入時化名

導入其它模塊時,直接化名爲簡約版,是我相當常用的,甚至有一些業界約定俗成的化名。無論是模塊,模塊中的函數或變量,都可以此種方式化名簡化之。

# 業界約定俗成的一些化名
import pandas as pd
import numpy as np
# 自定義模塊與自定義函數的化名
from zhihu_base import get_all_topics_detail as zhihu

我編程時給函數或變量命名的習慣是,讓人一看到名字就能知道該它是做什麼的,如此以來名稱就會挺長。函數因爲要被調用,尤其是外部調用,寫的複雜點倒能理解。但如果是一個不被外部調用的變量,爲什麼不直接在定義變量時就定義一個簡約的名字呢?

情境B:同一行語句多次調用名字,臨時簡化

這裏有一種情境,調用該變量的大部分語句都相對簡約,用全稱更易讀,但偶爾有一句複雜的語句,要多次調用該變量,導致該語句特別長,此時要臨時要用一個變量化名,簡化代碼。


sql_search = 'select url_token,zhihu_name,lase_active_time from zhihu_whos_v;'
df_topics_details = pd.read_sql(sql_search,conn)
# 這裏省略很多代碼
# 此時出現一條相對複雜冗長的語句,多次出現該變量名
df_value_v = df_topics_details[(df_topics_details['upvotecount']>100000) & (df_topics_details['last_activity']>'2019-09-01') ]

該語句是爲了把 df_topics_details 這個數據集之中,符合條件 upvotecount > 100000last_activity >'2019-09-01'的數據篩選出來,是 pandas 中相當常用的語句。後來我發現,在這種多次調用某個變量名或函數名的語句中,可以臨時加一個化名,來簡化該語句長度。像這樣:


df_topics_details = dtd
df_value_v = dtd[(dtd['upvotecount']>100000) & (dtd['last_activity']>'2019-09-01') ]

但是這種化名,並不適合在定義該變量時就如此做。試想我一開始就把該變量定義爲 dtd,其餘許多行代碼會極其不易讀——我或者代碼的其它讀者完全無法理解dtd指代什麼。如果更多變量都採用這種風格,代碼的可讀性將有多糟糕啊!

情境C:文件對象化名

其實文件對象化名這個說法倒不準確,本質上是變量的賦值:把一個特定的文件對象賦值給一個變量來指代保管。單獨拎出來,是因爲它太高頻使用了。類似fw或者frwriter也是約定俗成的命名習慣。

實例 X:

fw = open("my_test.txt", "at")
fw.write("xue.cn 月收費僅15元,對編程自學者相當友好。")
fw.close()

實例Y:

with open("my_test.txt", "at") as fw:
    fw.write("xue.cn 可以在網頁上一邊閱讀一邊在線寫代碼。")

實例Z:

comms_file = output_path + 'xuecn_comments_statistics_' + str(datetime.datetime.now())[:10] + '.xlsx'
with pd.ExcelWriter(comms_file) as writer:
	comms_counts_monthly.to_excel(writer, sheet_name='留言月報')
	comms_counts_weekly.to_excel(writer, sheet_name='留言週報')
	comms_counts_daily.to_excel(writer, sheet_name='留言日報')
	comms_by_reg_date.to_excel(writer, sheet_name='每日激活用戶的留言情況')
	comms_by_reg_week.to_excel(writer, sheet_name='每週激活用戶的留言情況')
	comms_counts_by_hour.to_excel(writer, sheet_name='留言活躍時段')
	vote_by_name.to_excel(writer, sheet_name='用戶獲贊')
	name_count_by_vote.to_excel(writer, sheet_name='用戶獲讚的分佈')
	vote_by_content.to_excel(writer, sheet_name='留言獲贊')
	content_count_by_vote.to_excel(writer, sheet_name='留言獲讚的分佈')

情境D:化名是通用的操作

如我上一篇筆記提及,sql 語句也有“化名”的方法,用的關鍵詞和python導入時所用到的 as 是一樣的。


with data as(
  select 
    date(created_at) as time,
    user_id
  from user_comments
  union all
  select 
    date(created_at) as time,
    user_id
  from user_activities
)
select
  time,
  count(distinct user_id) as 每日學習用戶數
from data
group by time
order by time

def who_is_v_detail

小結

我比較少細究某個化名,到底是對函數、變量或對象進行化名。核心在於,化名只是給名字複雜的東西,另外取了一個簡單好記的指代他,不管名字如何,那東西的特性不變,所指代的總還是ta。

好似某個人叫“因缺思廳·尼古拉斯·蔣·巴斯帝國五世·一品帶刀侍衛·阿拉斯加·狗蛋·王”,你可以簡稱他:老王。

“化名”是編程和日常生活中普遍存在的現象,只不過具體在某個語言中,它通過什麼關鍵詞或語法來實現而已。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章