下标(从另一个脚本实例化并调用的脚本)仅运行被调用函数,而不是整个脚本时出现问题

2024-09-30 16:33:25 发布

您现在位置:Python中文网/ 问答频道 /正文

目标:从上标开始,在for循环的每次迭代中,向下标中的函数发送一个列表,更新该列表,退出下标中的函数,并执行若干操作,然后进入下一次迭代

问题:只运行我从上标调用的函数,而不是整个下标

CrossValidationSmall.py(上标)

import subfileTest

data = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J','K']
n = 2

for start in range(0, len(data), n):
    stop = start + n
    test = data[start: stop]
    train = data[:start] + data[stop:]
    subfileTest.set_train_data(train)

subfileTest.py(下标)

train_data = []

def set_train_data(train):
    global train_data
    train_data = train

print(train_data) #should output the lists each time subfileTest is called.

预期产量

MacBook-Pro:SmallerEnviromentTest Me$ python CrossValidationSmall.py
['C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']
['A', 'B', 'E', 'F', 'G', 'H', 'I', 'J', 'K']
['A', 'B', 'C', 'D', 'G', 'H', 'I', 'J', 'K']
['A', 'B', 'C', 'D', 'E', 'F', 'I', 'J', 'K']
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'K']
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']

电流输出

MacBook-Pro:SmallerEnviromentTest Me$ python CrossValidationSmall.py
[]

Tags: 函数py列表fordatatrainstartpro
1条回答
网友
1楼 · 发布于 2024-09-30 16:33:25

据我所知,您需要在每次迭代中完整地调用您的下标

事情是这样的:

  • 一旦找到一个新的模块,它就会被执行,并且初始执行的模块会被缓存
  • 当相同的模块导入到不同的文件中时,将返回缓存的版本
  • 此缓存版本在进程的整个生命周期内都有效

因为您需要在每次迭代时重新运行下标,所以可以使用一个类。类的一个对象,用于:

  • 存储每次迭代的数据
  • 编写处理此数据的任意数量的函数
  • 根据需要保留每个对象的值

上标

from subscript import ModelCrossValidator

trial = 0

data = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']
n = 2

for start in range(0, len(data), n):
    trial += 1

    stop = start + n
    test = data[start: stop]

    # train_subset to be used for cross validation
    train_subset = data[:start] + data[stop:]

    cross_validator = ModelCrossValidator(train_subset)
    cross_val_score = cross_validator.calc_score()

print("CrossValSet: {}, Data: {}, Score: {:.2}".format(trial, cross_validator.data, cross_val_score))

下标

import random

class ModelCrossValidator:

    def __init__(self, train_subset):
        self.data = train_subset     # your folded cross-val data
        self.model = None            # can pass in a model too here
        self.accuracy = 0            # other fields that you might need

    def calc_score(self):
        # you can have any number of functions like this.
        # all will deal with only the data from a single object.

        self.accuracy = 0.8 + (random.random()) % 0.2
        return self.accuracy

输出:

Macbook-Pro: chimichanga$ python superscript.py 
CrossValSet: 1, Data: ['C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K'], Score: 0.89
CrossValSet: 2, Data: ['A', 'B', 'E', 'F', 'G', 'H', 'I', 'J', 'K'], Score: 0.94
CrossValSet: 3, Data: ['A', 'B', 'C', 'D', 'G', 'H', 'I', 'J', 'K'], Score: 0.9
CrossValSet: 4, Data: ['A', 'B', 'C', 'D', 'E', 'F', 'I', 'J', 'K'], Score: 0.84
CrossValSet: 5, Data: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'K'], Score: 0.88
CrossValSet: 6, Data: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], Score: 0.94

相关问题 更多 >