2016-07-29 57 views
5

我知道有一個類似的問題已經問過,但沒有回答我所需要的,因爲我有點不同。在生成器中返回參數

我的代碼:

def tFileRead(fileName, JSON=False): 
    with open(fileName) as f: 
     if JSON: 
      return json.load(f) 
     for line in f: 
      yield line.rstrip('\n') 

我想做的事: 如果JSON是真實的,這意味着從JSON文件的閱讀,我想回到json.load(f),否則,我希望得到的線將該文件轉換爲生成器。

我試過了將發生器轉換成json的替代方法,但是它非常混亂,速度非常快,而且效果不佳。

+0

如果不是JSON嘗試返回一個生成器的閉包 – Aaron

+1

單個函數必須返回或返回。不是 – Aaron

+1

你可以從'json.load'產生,但這隻會產生字典中的密鑰。您如何計劃在這兩種情況下使用該功能? –

回答

2

我想到的第一個解決方案是顯式返回一個生成器對象,它將提供您嘗試實現的確切行爲。

問題是:如果你明確地返回了一個像這樣的生成器對象return (line.rstrip('\n') for line in f)該文件將在返回後關閉,並且從文件中讀取任何進一步的內容都會引發異常。

你應該在這裏寫兩個函數:一個讀取一個json文件,一個讀取普通文件。然後你可以編寫一個包裝器,該包裝器需要一個參數來調用這兩個函數中的哪一個。

或者只是迭代部分移動到另一個這樣的功能:

def iterate_file(file_name): 
    with open(file_name) as fin: 
     for line in fin: 
      yield line.rstrip("\n") 


def file_read(file_name, as_json=False): 
    if as_json: 
     with open(file_name) as fin: 
      return json.load(fin) 
    else: 
     return iterate_file(file_name) 
+0

你爲什麼在談論他們沒有做的事情? –

+0

@StefanPochmann你是對的。我在這裏錯過了一步。我在想,你可以這樣做......但是等等,這不行。這就是我提到它的原因。 – Wombatz

1

你可以yield from裝載JSON,從而遍歷的字典鍵 - 值對的字典,但是這不會是你想要的行爲。

def tFileRead(fileName, JSON=False): 
    with open(fileName) as f: 
     if JSON: 
      yield from json.load(f).items() # works, but differently 
     for line in f: 
      yield line.rstrip('\n') 

這將是很好,如果你可以只返回一個發電機,但是這是不行的,因爲使用with,發電機被消耗之前的文件,一旦封閉,函數返回時,即。

def tFileRead(fileName, JSON=False): 
    with open(fileName) as f: 
     if JSON: 
      return json.load(f) 
     else: 
      return (line.rstrip('\n') for line in f) # won't work 

或者,你可以定義另一個函數只是從文件中產生的線條和使用發電機:

def tFileRead(fileName, JSON=False): 
    if JSON: 
     with open(fileName) as f: 
      return json.load(f) 
    else: 
     def withopen(fileName): 
      with open(fileName) as f: 
       yield from f 
     return (line.rstrip('\n') for line in withopen(fileName)) 

但是,一旦你在那裏,你真的可以只使用兩個單獨的功能用於讀取文件en-block爲JSON或迭代行...

+0

你怎麼知道JSON加載到字典,而不是列表?另外,我發現*「如果你可以返回一個發電機」*誤導你,因爲你**正在返回一個發電機(在你的第一個版本中)。 –

+0

@StefanPochmann關於字典:你是對的,沒有想到JSON返回例如一個列表。關於返回一個生成器:我的意思是用'return'返回,就像第二種方法一樣。 –