標籤:

編程中什麼是「Context(上下文)」?

最近讀Flask的文檔,讀到很多關於Context(上下文)的術語,如應用上下文,請求上下文等,查閱資料但沒有得到理解?有沒有比較好的解釋?


每一段程序都有很多外部變數。只有像Add這種簡單的函數才是沒有外部變數的。一旦你的一段程序有了外部變數,這段程序就不完整,不能獨立運行。你為了使他們運行,就要給所有的外部變數一個一個寫一些值進去。這些值的集合就叫上下文。

譬如說在C++的lambda表達是裡面,[寫在這裡的就是上下文](int a, int b){ ... }。


你查不到是因為上下文這個東西不是一個具體的東西,上下文在不同的地方表示不同的含義,要感性理解。

context其實說白了,和文章的上下文是一個意思,在通俗一點,我覺得叫環境更好。

....

林沖大叫一聲「啊也!」

....

問:這句話林沖的「啊也」表達了林沖怎樣的心裡?

答:啊你媽個頭啊!

看,一篇文章,給你摘錄一段,沒前沒後,你讀不懂,因為有語境,就是語言環境存在,一段話說了什麼,要通過上下文(文章的上下文)來推斷。

子程序之於程序,進程之於操作系統,甚至app的一屏之於app,都是一個道理。

程序執行了部分到達子程序,子程序要獲得結果,要用到程序之前的一些結果(包括但不限於外部變數值,外部對象等等);

app點擊一個按鈕進入一個新的界面,也要保存你是在哪個屏幕跳過來的等等信息,以便你點擊返回的時候能正確跳回,如果不存肯定就無法正確跳回了。

看這些都是上下文的典型例子,理解成環境就可以,(而且上下文雖然叫上下文,但是程序裡面一般都只有上文而已,只是叫的好聽叫上下文。。進程中斷在操作系統中是有上有下的,不過不給題主說了,免得產生新的問題)


context是environment的snapshot.


上下文是一種非常泛化的概念,大致意思就是「與現在這個工作相關的周圍環境」。這個「周圍環境」具體是什麼,完全取決於具體的語言。

比如Perl,函數調用有「標量上下文」與「列表上下文」,取決於調用函數的地方期望接收單個值還是列表值。

sub my_sub
{
if (wantarray) { return "a","b","c" }
else { return "give you one scalar" }
}

my $re_single = my_sub(); # get "give you one scalar"
my @multi = my_sub(); # get "a" "b" "c"


在語言學裡,語意學(semantics)不包含語境(context),語用學(pragmatics)則考慮到語境對語意的影響。

在編程中,也就是一些編程構件(如函數)需要考慮到當時的編譯/運行環境,才能理解它的語意/運行結果。


和其他傳入對象參數沒什麼區別。

但是通常使用Context來描述有幾個特點:

  1. 被傳入Context的部分(組件),內部需要頻繁的獲取Context的data和調用function。對context有很強的依賴,實現建立在context的基礎上。

  2. Context會被較為多數部分(組件)所需要,在軟體實現部分Context會在某個scene下出現單一實例化,然後被多個部分(組件)實例對象調用。出現局部全局化。

  3. Context會持有很多狀態data。
  4. Coder習慣,命名選擇困難下的膠合產物。

另外 Context的中文翻譯是誰想出來的,站出來我保證不打你。


context就是對一堆亂七八糟的環境變數的一個聽起來好聽一點的名字

我做設計的時候,經常發現很多相關的東西不合適放在主幹對象里,那就單獨弄個context

如:application的applicationcontext

event的eventcontext

dinner的dinnercontext


一般來說是想要有個object來保存狀態,想不出好的名字然後就叫context了


最近在學Python + Flask,搜到了這個問題,也來回答一下吧。

既然題主也在學Flask,就用Flask來舉例:

Flask從客戶端收到請求的時候,視圖函數如果要處理請求的話,可能就要訪問一些對象。那麼這些對象可以通過參數的形式傳遞進來,或者是在函數中訪問外部變數。所以這個外部變數要有特定的值才會有意義,也即所謂的上下文。

譬如Flask中的request變數,這是一個請求上下文,也就是當請求被推送之後,request才會有意義,接下來才可以使用request,否則就會報錯,因為缺少上下文。

引用一段《Flask Web開發》中的代碼:

from flask import request

@app.route("/")
def index():
user_agent = request.headers.get("User-Agent")
return "&

Your browser is %s&" % user_agent

就像前面說的,函數index()訪問了request這個外部變數,但request必須在請求推送之後才可以使用,這就是一個請求上下文全局變數。


Context就Context,當年非得翻譯成上下文.....

簡單的理解,就是相關的內容。

最大的坑就是之前一直以為Context是一種固定的結構。。

多年之後才知道不同情況下用Context,Context表示的內容是不一樣的。


理解了stateless的概念就不會有疑惑了。


前面好多人的看法都是高屋建瓴(不知道這麼形容對不對),我來談談我的看法吧!

所謂上下文,就是與當前操作相關的前一步狀態和下一步狀態!

在很多情況下,要執行某一操作,需要做很多的準備工作!而這一操作前必須滿足的狀態,就是當前操作的上文。由此及彼,當前操作之後要達到的狀態就是當前操作的下文!


輪子哥已經解釋的非常清楚了。

我想題主疑惑的不是上下文到底是什麼意思,而是什麼叫做建立上下文關係,建立上下文關係的好處是什麼。

Python當中open函數的作用大家都知道,但是直接調用open函數就必須手動close。所以python給大家提供了一個語法糖:

with open() as f:

text = f.read()

在這個block當中,python為大家創建了一個上下文關係,並且自動的close打開的IO流。按照語法規定,一旦脫離當前block,則無法調用block裡面所有的局部變數,所以text是無法在block之外調用的,但是因為有上下文關係的存在,我們仍然可以調用text。with的好處不僅如此,這裡不做多講。


程序運行狀態與相關資源的合集。


簡單的說就是一個狀態,當與其它模塊進行交互,其它模塊執行完了通知你的時候,通過context你就可以知道在交互之前你的模塊是一個什麼樣的狀態,然後你可以按照這個狀態做相應的處理。


以我自己的認識水平來說,在C或者C++中,context一般就是一個結構體,用來存儲一些關鍵信息,比如切換上下文時,要保存切換之前的狀態和數據,這需要一個結構體來承擔,然後將contex中的狀態和數據重新賦值為新的,這樣就切換了,等運行完了之後,又要切換回來,那麼之前保存的那些狀態和數據又要重新啟用了,就是這麼回事。


context翻譯「上下文」是很讓人費解的,應該說成是「跟隨信息」更好理解,並且通常是為了「user"這個角色的狀態變化而設立的。


這些翻譯名真的要改改,坑了不少剛入行的人,其實就是中文裡所謂的語境,就是語言環境。

即一個文字或詞的意思,光看該字或詞它本身,是不能得到完整的意思,甚至會有歧義,而通過該字或詞所處的語言環境,結合它前後語句的意思,就能分辨它到底是什麼意思。

(╯□╰)o。


Context,在程序翻譯為上下文。上下文就是提供一些程序的運行環境基礎信息。比如,要運行一個APP,這個APP運行時需要載入配置文件,然後寫到一個類中,然後你需要的時候,通過這個類來獲取這些參數。--這個類就是所謂的上下文。不知道這個解釋對不對。


個人理解,操作系統調度的時候,進程切換,需要保存各相關寄存器的值。


推薦閱讀:

如何養成良好的黑客思維?
IEEE float 的 NaN 是出於什麼理由設計的?
程序员敲代码都喜欢听什么?
有哪些新手程序猿不知道(或容易忽視)的大殺技?
西門子Step7編寫程序中 複位和置位優先型起保停電路有什麼不同 意義在哪?

TAG:編程 | Flask |